具有可选关系的联合表

时间:2018-10-24 17:45:59

标签: activerecord ruby-on-rails-5

我有三种型号:

  • 公司;
  • 投资者;
  • 经纪人。

在现实世界中,每个投资者都可以投资许多公司,但是在某些人中,可以在经纪人的协助下进行投资。 我是通过联合餐桌做到的。

def change
  create_join_table :companies, :investors do |t|
    t.references :broker, index: true, optional: true
  end
end

class Company < ApplicationRecord
  has_and_belongs_to_many :investors
end

class Investor < ApplicationRecord
  has_and_belongs_to_many :companies
end

class Broker < < ApplicationRecord
  has_many :companies
end

我应该如何配置我的模型/迁移以获取下一个信息:

Company.first.investors.first.broker

经纪人不属于投资者,在每个公司/投资者对中可以是不同的经纪人。

1 个答案:

答案 0 :(得分:1)

使用has_many through associations并将代理添加到联接模型上。添加正确的迁移后,您的模型将如下所示:

class Company < ApplicationRecord
  has_many :company_investors
  has_many :investors, through: :company_investors
end

class Investor < ApplicationRecord
  has_many :company_investors
  has_many :companies, through: :company_investors
end

class Broker < ApplicationRecord
  has_many :company_investors
  has_many :companies, through: :company_investors
end

class CompanyInvestor < ApplicationRecord
  belongs_to :broker
  belongs_to :investor
  belongs_to :company
end

使用此模型,您可以将Investor添加到具有Company或不具有Broker的{​​{1}}关联中,并加以区分。我还建议为连接模型(在我的代码中命名为CompanyInvestor)命名一个更重要的名称,例如Investment