Rails has_many通过has_one或belongs_to

时间:2019-09-12 19:33:08

标签: ruby-on-rails rails-activerecord active-record-query

我有3种型号:Company,Portable和Jobsite。我希望能够呼叫company.portablescompany.jobsitesportable.companyportable.jobsitejobsite.portablesjobsite.company。我已经建立了这样的关联:

class Company
  has_many :portables
  has_many :jobsites, through: :portables
end

class Portable
  belongs_to :company
  belongs_to :jobsite
end

class Jobsite
  has_many :portables
  has_one  :company, through: :portables
end

我可以成功调用除jobsite.company以外的所有内容。拨打电话时,我得到:

ActiveRecord::HasOneThroughCantAssociateThroughCollection: Cannot have a has_one :through association 'Jobsite#company' where the :through association 'Jobsite#portables' is a collection. Specify a has_one or belongs_to association in the :through option instead.

设置这些关联的正确方法是什么?我是否必须在工作场所上将工作场所与公司的关联设置为belongs_to :company,然后将jobsite_id添加到公司?似乎应该有另一种方法可以利用我已经设置的内容来实现这一目标。

1 个答案:

答案 0 :(得分:0)

如果考虑一下,所描述的架构将无法正常工作。如果您真的希望Jobsite只有一家公司,那么就无法通过Portable,因为Jobsite有很多Portable。

所以您的左边有两个选择: -如果您的意思是一个Jobsite应该有一个“主要”公司,则直接拥有一个Job has_one :company,而没有:through部分。 -如果您要说的是工作现场,那么工作现场实际上可以通过许多便携式计算机拥有许多公司,那么只需将您的代码更改为have_many:

奖励选择,您也可以通过以下操作来喜欢这些选项:

has_one :company, -> {where(primary: true)}

您可以用这种方式来做各种花哨的事情。