2012-01-11 62 views
2

基本上,我想完成这样的事情:如何才能has_and_belongs_to_many同一模型的多个实例?

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 

请注意,只要您在此处设置适当的外键名称,就可以重命名连接表和外键。

相关问题