2012-03-19 110 views
0

那麼,我知道如何處理從一個模型(稱爲ModelA)通過第二個(ModelB)到第三個(ModelC)的關聯。但是如果第三個(ModelC)與第四個(ModelD)通過第四個(ModelD)相關聯,那該怎麼辦呢?Rais長鏈模型協會

#ModelA 
has_many :model_bs 
has_many :model_cs, :trough => :model_bs 

#ModelC 
has_many :model_ds 
has_many :model_es, :trough => model_ds 

問題是:如何獲得ModelE記錄的集合,與特定的ModelA記錄槽相關聯?

+0

我已經嘗試了直接路徑a.model_cs.model_es,但它不能正常工作。 – Almaron 2012-03-19 13:53:17

+0

我試圖自己寫這個查詢,但我不是很擅長,它看起來太複雜了。 – Almaron 2012-03-19 13:53:49

回答

2

ModelA的實例上調用model_cs將返回一個model_cs的數組。如果您想要訪問所有model_es,則需要遍歷model_cs的數組,並將這些結果追加到數組或散列中。

array1 = @model_a.model_cs.all 
array2 = [] 
array1.each do |x| 
    array2 << x.model_es 
end 

array2現在包含所有其最終母公司爲原model_amodel_es

+0

謝謝,我正在考慮類似的東西,但認爲有一些easyer。 – Almaron 2012-03-19 14:16:32

+0

您可以使用'map'縮短代碼。以下(未經測試)應該工作'array = @ model_a.model_cs.map {| x | x.model_es}'。這種做法是相同的,但是採用簡單的形式。 – 2012-03-19 14:23:30

+2

您可以通過使用一些語法糖來進一步縮短它:'@ model_a.model_cs.map(&:model_es)'。根據您的要求,您可能還想對結果調用'flatten'和'uniq'。 – Brandan 2012-03-19 17:56:13