我如何has_and_belongs_to_many同一模型的多个实例?

时间:2012-01-11 21:22:39

标签: ruby-on-rails ruby

基本上,我想完成这样的事情:

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”?

2 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:6)

这是可行的,但我强烈建议改为使用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

拥有一流的连接模型可以更轻松地管理关系,并让您可以自由地在以后添加相关的元数据。