2015-11-04 36 views
0

我有一個與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

回答

0

我怎麼會說數據形有關聯的選擇[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