2012-01-11 18 views
2

は基本的に、私はこのような何かを達成したい:同じモデルの複数のインスタンスを複数持つことはできますか?

Class Node < ActiveRecord::Base 
    has_and_belongs_to_many :parents, :class_name=>'Node' 
    has_and_belongs_to_many :children, :class_name=>'Node' 
end 

をそれが動作していない、と私はこれを行うための適切な方法全くわかりません。私は次に明示的に結合テーブルを定義しようとしており、両方を使用しています:それが解決策なら、列は "children_id"または "child_id"と呼ばれますか?

答えて

7

これはなんとかですが、私は強く代わりhas_many :throughを使用することをお勧め:

class Node < ActiveRecord::Base 
    has_many :parent_node_links, 
    :class_name => 'NodeLink', 
    :foreign_key => :child_id 

    has_many :parents, 
    :through => :parent_node_links, 
    :source => :parent 

    has_many :child_node_links, 
    :class_name => 'NodeLink', 
    :foreign_key => :parent_id 

    has_many :children, 
    :through => :child_node_links, 
    :source => :child 
end 

class NodeLink < ActiveRecord::Base 
    belongs_to :parent, 
    :class_name => "Node" 
    belongs_to :child, 
    :class_name => "Node" 
end 

ファーストクラスを持つモデルは、それははるかに簡単に関係を管理することができます参加しに関連するメタデータを追加するために、あなたに自由を与えます遅い時点。

10
Class Node < ActiveRecord::Base 
    has_and_belongs_to_many :parents, :class_name=>'Node', :join_table => "parents_children", :foreign_key => :child_id, :association_foreign_key => :parent_id 
    has_and_belongs_to_many :children, :class_name=>'Node', :join_table => "parents_children", :foreign_key => :parent_id, :association_foreign_key => :child_id 
end 

ここで適切な外部キー名を設定する限り、結合テーブルと外部キーの名前を変更できます。

関連する問題