Rails模型has_many

我今天开始学习rails并不太确定它是如何工作的:

可以说我有一家公司,该公司可能有很多子公司。

子公司是公司。 由于显而易见的原因,公司不能成为自己的子公司。

子公司不能拥有也是公司子公司的子公司

所以子公司也可以拥有子公司,所以它无限制地嵌套

我不确定的是,子公司是一家公司

class Company < ActiveRecord::Base has_many :subsidiaries end class Subsidiary < ActiveRecord::Base belongs_to :companies end 

我确定这是错的,只是把东西放在这里

更新:

好的,所以我按照下面的说明操作:

 class Company < ActiveRecord::Base validates :name, presence: true belongs_to :company has_many :subsidiaries, foreign_key: 'company_id', class_name: 'Company' end 

在我的一个模板中:

  
  • 0 ? "(#{company.subsidiaries.length} subsidiaries)" :"" }", company_path(@company, :id => company.id) %>
  • 现在这是错误的,会发生的事情是,有子公司的Ones显示他们没有子公司,而子公司显示他们有子公司,所以基本上它现在显示它的父母,它的“孩子”

    不知道为什么会这样?

    你想要的是一个递归的自我关系:

     class Company < ActiveRecord::Base belongs_to :company has_many :subsidiaries, foreign_key: 'company_id', class_name: 'Company' end 

    因此,基本上,一家公司属于一家公司,并拥有许多公司。 但是,我们为其公司(子公司)设置了一个特殊名称,因此我们通过手动设置关系为其提供“别名”。 您可能希望为“父母”公司做同样的事情。

    然后,您将使用validation来检查所有这些条件。

    我会用

     class Company < ActiveRecord::Base has_many :subsidiaries, class_name: 'Company', foreign_key: :parent_id belongs_to :parent, class_name: 'Company' end 

    要使用这些关系,您需要在表中使用parent_id列:

     rails g migration add_parent_id_to_companies parent_id:ineteger rake db:migrate 

    你会这样使用:

      A / \ / \ BC / \ / \ DE A.subsidiaries => [B,C] B.subsidiaries => [D,E] C.subsidiaries => [] # actually a relation without results B.parent => A C.parent => A A.parent => nil D.parent => B