2016-02-15 94 views
1

我有一個預告片模型,每個預告片belongs_to電影和一個電影has_many:發佈。和預告片has_many:通過發佈:電影Rails:通過關聯預加載has_many

發佈有一列:可以是「Netflix」,「劇院」或「激流」的媒介。

在我的控制器:

@trailers = Trailer.all 

在我看來,我要檢查每一個拖車的版本:

<%= render @trailers %> 

則:

if trailer.releases.where(medium:"Torrent").first 
    # show a Torrent icon 
end 

有沒有一種辦法預裝trailer.releases,這樣我就不會錘擊數據庫,並且爲每個渲染的預告片調用trailer.releases.where(medium:"Torrent").first, trailer.releases.where(medium:"Netflix").first, trailer.releases.where(medium:"Theater").first

如何對此進行優化?

+0

在我的回答看看這個[SO問題](http://stackoverflow.com/questions/35374387/how-to-specify-eager-loading-association-in-rails-model/35374496#35374496) – nbermudezs

+0

基本上你需要做的是在你的Trailer模型中添加一個default_scope。如果您不想在應用程序的任何位置包含發佈版本,則可以使用命名範圍而不是'default_scope' – nbermudezs

回答

0

嘗試在控制器:

@trailers = Trailer.all # 1 query to DB 
@movies_releases = %w(Torrent Netflix Theater).map do |medium| 
    [medium, Release.where(medium: medium).pluck('DISTINCT movie_id')] 
end.to_h # 3 queries to DB 

然後在視圖:

if @movies_releases['Torrent'].include?(trailer.movie_id) 
    # show a Torrent icon 
end