2013-08-09 3 views
0

У меня есть контроллер, найти 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 запросов?

ответ

1

использование жадная загрузка

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

Существует "включает в себя" метод ActiveRecord. Это позволяет предварительно загружать записи.

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

Не уверен, если вы можете сделать что-то вроде includes(items: :photo), но дать ему попробовать.

+0

Это не работает для одного объекта. только для сбора объектов. – Extazystas

0

Для Rails 4

@collection = Collection.includes(items: :photos).find_by_active(true) 
Смежные вопросы