我有3种型号:Company,Portable和Jobsite。我希望能够呼叫company.portables
,company.jobsites
,portable.company
,portable.jobsite
,jobsite.portables
和jobsite.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添加到公司?似乎应该有另一种方法可以利用我已经设置的内容来实现这一目标。
答案 0 :(得分:0)
如果考虑一下,所描述的架构将无法正常工作。如果您真的希望Jobsite只有一家公司,那么就无法通过Portable,因为Jobsite有很多Portable。
所以您的左边有两个选择:
-如果您的意思是一个Jobsite应该有一个“主要”公司,则直接拥有一个Job has_one :company
,而没有:through
部分。
-如果您要说的是工作现场,那么工作现场实际上可以通过许多便携式计算机拥有许多公司,那么只需将您的代码更改为have_many:
。
奖励选择,您也可以通过以下操作来喜欢这些选项:
has_one :company, -> {where(primary: true)}
您可以用这种方式来做各种花哨的事情。