我有一个预告片模型,每个预告片属于一个电影,一个电影has_many:发行。和Trailer has_many:发布:电影
发布有一列:中等,可以是“Netflix”,“Theatre”或“Torrent”。
在我的控制器中:
@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 :(得分: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