2013-04-19 6 views
1

У меня есть следующие классы в моем приложении:Использование включает в себя с функциями AREL

class Prompt 
    has_many :entries 
end 

class Entry 
    belongs_to :prompt 
    belongs_to :user 

    def self.approved 
    where("is_approved") 
    end 
end 

class User 
    has_many :entries 
end 

И я хочу, чтобы отобразить таблицу всех «утвержден» записи для данного запроса и пользователей, что они belong_to. Чтобы создать этот список, я сделать следующий запрос:

prompt = Prompt.find(prompt_id, :include => {:entries => :user})

Но когда я запускаю следующий цикл, он делает запрос для каждого пользователя, а не использовать упреждающие пользователь

prompt.entries.approved.each do |entry| 
    puts entry.user.id 
end 

Как я переписать это так, чтобы он не выполнял запрос для каждой итерации цикла?

ответ

0

Он выполняет запрос для каждого пользователя, потому что entries.approved вызывает запрос * где ('is_approved') * для каждой записи. Оператор find просто извлекает все приглашения и создает объекты с доступом к их дочерним атрибутам. Я думаю, что вам нужен оператор where, который выбирает все записи, у которых есть атрибут is_approved, а затем запускается через цикл, печатающий их идентификаторы.

Может быть, попробовать что-то вроде @entries = Entry.where (is_approved: истинные) .includes (записей: пользователь))

Тогда

entries.user.each сделать | | пользователь puts пользователь.id конец

Hope thats помогает.

+1

Есть ли способ, который я могу инкапсулировать эту «утвержденную» логику в функцию? Кроме того, как бы вы написали его так, чтобы результатом был объект 'Prompt' со всем, что с нетерпением было загружено – sguha

+0

Хм, насколько я могу понять, что own_to/has_many не будет охотно загружать другой путь, но с @entries = Entry.where (is_approved: true), вы должны иметь возможность получить доступ к загруженному с запросом приглашению entries.prompt.each do | prompt |. Извините –