Rails:通过关联预加载has_many

时间:2016-02-15 23:32:25

标签: ruby-on-rails activerecord

我有一个预告片模型,每个预告片属于一个电影,一个电影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

如何优化此功能?

1 个答案:

答案 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