单个ActiveRecord的多个外键has_one关系

问题描述:

我有一个与Office和Department相关的模型。单个ActiveRecord的多个外键has_one关系

class DataForm < ActiveRecord::Base 
    belongs_to :office 
    belongs_to :department 
end 

我也有第三个模型,监督许多办公室/部门组合。

class ManagementGroup < ActiveRecord::Base 
    belongs_to :office 
    belongs_to :department 
end 

我该怎么说DataForm与ManagementGroup有关联,其中办公室和部门彼此同步。

class DataForm < ActiveRecord::Base 
    belongs_to :office 
    belongs_to :department 
    # how would I get the below association to work 
    has_one :management_group, foreign_key: [:office_id, :department_id] 
end 
+0

我不太明白的关系,因此,如果具有的DataForm只有一个选择[ManagementGroup,为什么不选择[ManagementGroup属于的DataForm?哎呀,我认为DataForm应该属于ManagementGroup。 – Sam

+0

我想它属于纯粹基于其办公室/部门组合的管理组。我打算获得管理组的实际PK,然后将其存储起来。但是这可能会导致不同步和额外的更新,而不是仅仅使用已经可以为我建立关联的数据。 – Jared

我怎么会说数据形有关联的选择[ManagementGroup在办公室和部门相互同步。你不能那样做。相反,重组这么:

  • 一个DataForm属于ManagementGroup
  • 一个ManagementGroup belongs_to的一个:office:department

因此,你可以通过观察确定您DataForm:office:departmentManagementGroupbelongs_to

@data_form.management_group.office 

或更好,但使用的委托:

然后,您可以用类似访问DataForm的`办公室。下面的示例:

class DataForm < ActiveRecord::Base 
    belongs_to :management_group 
    delegate :office, to: :management_group 
    delegate :department, to: :management_group 
end 

class ManagementGroup < ActiveRecord::Base 
    belongs_to :office 
    belongs_to :department 
    has_many :data_forms 
end 

然后,你可以这样做:

@data_form.office 
@data_form.department 
+0

为什么选择投票? –

+0

我相信这也是正确的方式,但我不太了解贾里德的商业案例。 – Sam