2010-01-28 48 views
0

我有4種型號:TRANSAC,transac_data,項目,在「TRANSAC」視圖dvd_details導軌的has_many關係(4款),以及如何在視圖訪問

class Transac < ActiveRecord::Base 
    has_many :transac_datas 
    has_many :items, :through => :transaction_datas 
end 

class TransactionData < ActiveRecord::Base 
    belongs_to :item 
    belongs_to :transaction 
end 

class Item < ActiveRecord::Base 
    has_many :transaction_datas 
    has_many :transacs, :through => :transaction_datas 
end 

class DvdDetails < ActiveRecord::Base 
    has_many :items 
end 

現在,我需要從獲得的東西所有這些模型,如:

<td><%=h transac.status %></td> 
<% transac.transaction_datas.each do |td| %> 
    <td><%=h td.item_type %></td> 
<% end %> 

<% transac.items.each do |item| %> 
    <td><%=h item.item_type %></td> 
<% end %> 

,但我也需要從「DvdDetails」模式,即「最遠」遠離TRANSAC訪問某些信息。

我意識到,做這樣的事情就沒有真正的工作:

class Transac < ActiveRecord::Base 
    has_many :transac_datas 
    has_many :items, :through => :transaction_datas 
    has_many :dvd_details, :through => :items, :through => :transaction_datas 
end 

並在「TRANSAC」索引視圖做到這一點

<%=h transac.dvd_details.name %> 

什麼我需要做什麼來完成這個?

任何幫助表示讚賞! 謝謝!

回答

0

實際上,通過Ian White's nested_has_many_through plugin,你可以通過你想要的方式菊花鏈has_many。只需安裝插件,像這樣:

script/plugin install git://github.com/ianwhite/nested_has_many_through.git 

然後設置你的模型是這樣的:

class Transac < ActiveRecord::Base 
    has_many :transaction_datas 
    has_many :items, :through => :transaction_datas 
    has_many :dvd_details, :through => :items 
end 

這應該做你所需要的。

更新:這個問題最近出現了幾次。我寫了一篇文章,nesting your has_many :through relationships,詳細解釋。它甚至在GitHub上有一個附帶的示例應用程序來下載和播放。

+0

PS - 嵌套has_many:通過關聯就像啤酒 - 適度享受:) – 2010-01-28 05:21:19

+0

哈哈,酷!感謝您的幫助! – 2010-01-28 12:28:18

+1

有趣的是,有人雖然完美地表達了我的答案,但他們沒有提供他們自己的解決方案。 – 2010-01-28 14:07:59