与ActiveRecord中的属性的自引用关联

时间:2015-01-21 16:37:53

标签: ruby-on-rails ruby rails-activerecord

我试图复制一种关系,在这种关系中,某些东西可以有很多孩子,而且很多父母都有自己的属性。

item1 x2-> item2
      x3-> item3 x4-> item4 x2-> item1
                            x6-> item5

我无法创建检索子项的方法以及项目的父项。

这是我到目前为止所做的:

class Decomposition < ActiveRecord::Base
 belongs_to :parent, :class_name => 'Item', foreign_key: 'children_omnicode'
 belongs_to :child, :class_name => 'Item', foreign_key: 'parent_omnicode'    
end

class Item < ActiveRecord::Base
  has_many :decompositions, foreign_key: :parent_omnicode
  has_many :children, :through => :decompositions, source: :child
  has_many :parents, :through => :decompositions, source: :parent
end

我可以为Item创建子项,但.parent方法也会返回子项:

1 个答案:

答案 0 :(得分:2)

您需要通过创建两个直接Item关联来将Decomposition类关联更改为has_many

class Decomposition < ActiveRecord::Base
 belongs_to :parent, :class_name => 'Item', foreign_key: 'children_omnicode'
 belongs_to :child, :class_name => 'Item', foreign_key: 'parent_omnicode'    
end

class Item < ActiveRecord::Base
  has_many :parent_decompositions, class_name: "Decomposition", foreign_key: :parent_omnicode
  has_many :child_decompositions, class_name: "Decomposition", foreign_key: :children_omnicode
  has_many :children, :through => :child_decompositions, source: :child
  has_many :parents, :through => :parent_decompositions, source: :parent
end

您现在拥有代码的方式,:children:parent关联都指的是Decompositions,其中Item是父级。这解决了这个问题。