0

我有一个控制器可以找到 1 条记录(它的 uniq)

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

这个“@collection”有很多:items,其中有很多:photos

因此,鉴于它看起来像这样:

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

它会重现一堆 SQL 查询,例如如果 item 有 4 张照片,它将是 6 个查询:

Collection Load 
CollectionItem Load 
Photo Load (4 times)

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

4

3 回答 3

1

使用急切加载

@collection = Collection.find_by_active(true, {:include =>{:items => :photos})
于 2013-08-09T21:55:39.560 回答
0

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

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

不确定,如果你可以做类似includes(items: :photo)的事情,但试试看。

于 2013-08-09T21:58:03.963 回答
0

对于 Rails 4

@collection = Collection.includes(items: :photos).find_by_active(true)
于 2015-12-16T18:01:43.253 回答