渴望加载单个物体?

时间:2013-08-09 21:47:17

标签: ruby-on-rails ruby activerecord

我有一个控制器找到1条记录(其uniq)

class CollectionsController < ApplicationController
  def show
    @collection = Collection.find_by_active(true)
  end
end

这个'@collection'有很多:项目,有很多:照片

因此,在视图中它看起来像这样:

- @collection.items.each do |item|
    = image_tag item.find_active_photo.image_url(:small)

它会重现一堆SQL查询,例如,如果项目有4张照片,则会有6个查询:

Collection Load 
CollectionItem Load 
Photo Load (4 times)

如何减少此N + 1查询的数量?

3 个答案:

答案 0 :(得分:1)

使用预先加载

@collection = Collection.find_by_active(true, {:include =>{:items => :photos})

答案 1 :(得分:0)

ActiveRecord有一个“包含”方法。它允许预加载记录。

Collection.find_by_active(true).includes(:items)

不确定,如果您可以执行includes(items: :photo)之类的操作,请尝试一下。

答案 2 :(得分:0)

对于Rails 4

@collection = Collection.includes(items: :photos).find_by_active(true)