30 日 03:16 に編集し、移行とモデルの改善を示しました
それぞれが他の多くの要素に接続できる要素のテーブルがあります。Railsの移行とモデルでこれを行うことは可能ですか? (以下はSQLで実装されています)
要素の表:整数 ID の主キー フィールドと他のフィールドがあります。
要素間リンクの表:
CREATE TABLE inter_element_links
(
element1_id integer NOT NULL,
element2_id integer NOT NULL,
CONSTRAINT inter_element_links_pkey PRIMARY KEY (element1_id, element2_id),
CONSTRAINT foreign_key_on_id1 FOREIGN KEY (element1_id)
REFERENCES elements (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT foreign_key_on_id2 FOREIGN KEY (element2_id)
REFERENCES elements (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
そして、このクエリは、特定の要素にリンクされたすべての要素を、その ID (例: 3) で返します。
SELECT *
FROM elements
INNER JOIN inter_element_links ON (elements.id = inter_element_links.element1_id
OR elements.id = inter_element_links.element2_id)
WHERE (inter_element_links.element1_id = 3 OR inter_element_links.element2_id = 3)
AND elements.id <> 3
これはPostgresで機能し、Railsに変換したいのですが、Railsの解決策を見つけるのに苦労しています...私がやっていることは愚かですか、それともそれほど一般的ではないのですか?
これまでのところ、移行があります (これには、偽の複合主キーがあり、elements.id を参照する外部キーはありません):
class CreateInterElementLinks < ActiveRecord::Migration
def self.up
create_table :inter_element_links, :id => false do |t|
t.integer :element1_id, :null => false
t.integer :element2_id, :null => false
end
add_index :inter_element_links, [:element1_id, :element2_id], :unique => true
end
def self.down
remove_index :inter_element_links, [:element1_id, :element2_id]
drop_table :inter_element_links
end
end
また、次のモデルがあります。
class Element < ActiveRecord::Base
belongs_to :user
has_many :inter_element_links1, :foreign_key => 'element1_id', :class_name => 'InterElementLink', :dependent => :destroy
has_many :inter_element_links2, :foreign_key => 'element2_id', :class_name => 'InterElementLink', :dependent => :destroy
has_many :elements1, :through => :inter_element_links1
has_many :elements2, :through => :inter_element_links2
def inter_element_links ## Unless there's a more elegant rails solution, I will try to extend ActiveRecord::HasManyThroughAssociation, so things like: an_element.destroy, will destroy the entry in the inter_element_links table, and calls to an_element.elements will work.
inter_element_links1 + inter_element_links2
end
def elements
elements1 + elements2
end
end
class InterElementLink < ActiveRecord::Base
set_primary_keys :element1_id, :element2_id ## I have included the 'composite_primary_keys', '=3.1.0' gem
belongs_to :element
end
どんな考えでも大歓迎です!
過去 24 時間に、近いと思われるものをいくつか見つけましたが、まだ完全には理解できていません。
- 同様の問題がここで議論されましたが、提案されたプラグインを突き止めることができず、移行の面では役に立ちません。
- このプラグインを使用して、InterElementLink で Rails の模造主キーを正常に取得したので、element1_id = 3 および element2_id = 5 の場合、InterElementLink.find(3,5) への呼び出しは機能しますが、明らかに InterElementLink.find(5,3 ) は機能しません...そして、I/ActiveRecord はそれを必要とします。
- ActiveRecord を含む ORM が外部キーをサポートしていないことは理解しています。これについての適切な議論を参照してください(ただし、このプラグインを使用できることは理解しています)。 主キーを作成するためにこれを試みましたが、失敗しました。
どうもありがとう!