自我指涉has_many和belongs_to关系

时间:2012-01-25 22:39:35

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

我正在尝试围绕公司的概念构建架构。

公司可以拥有母公司(即集团公司)。一家公司也可以有几家儿童公司。但公司也可以是独立的,既没有子公司也没有母公司。我无法解决如何使用ActiveRecord对其进行建模的问题。这就是我所拥有的:

class Company < ActiveRecord::Base
    validates_uniqueness_of :company_id
    has_many :products
    has_many :subsidiaries, :class_name => "Company", optional: true
    belongs_to :parent_company, :class_name => "Company", optional: true
end

理想情况下,我希望能够检查company.subsidiaries,如果它是零,我知道该公司没有子公司。

任何有助于确定建立这种关系的正确方法的帮助都将不胜感激!

4 个答案:

答案 0 :(得分:1)

有什么东西可以阻止您使用ancestry gem吗?它很好地处理这样的树结构,并提供了大量的辅助方法来导航和操作树。

答案 1 :(得分:0)

更多地考虑has_many :through这个应用程序有点动态http://blog.hasmanythrough.com/2007/10/30/self-referential-has-many-through

更新

我撒谎......误读......第二次新编辑

更新...再次!

实际上,我只是在考虑它。那个博客应该给出一个坚定的工作榜样。对不起,我现在正在加班。睡眠剥夺会让你第二次猜测

答案 2 :(得分:0)

快速查看acts_as_tree gem源显示关系

belongs_to :parent, :class_name => name, :foreign_key => configuration[:foreign_key], :counter_cache => configuration[:counter_cache]
has_many :children, :class_name => name, :foreign_key => configuration[:foreign_key], :order => configuration[:order], :dependent => :destroy

其中:foreign_key将在您的表中设置为parent_id。但请注意,您必须实现遍历act_as_tree gem免费提供的方法。希望这能指明你的某种方向。

答案 3 :(得分:0)

这是我的解决方案:

belongs_to :page, :inverse_of => :subpages
has_many :subpages, class_name: "Page",
                 foreign_key: "page_id", 
                 dependent: :destroy