#ruby-on-rails #activerecord #eager-loading
#ruby-on-rails #activerecord #загрузка с нетерпением
Вопрос:
Все примеры :include для быстрой загрузки предназначены для запросов на уровне класса. Я попробовал это на своем экземпляре модели, и он по-прежнему выдавал кучу запросов — работает ли это на методах экземпляра?
#in controller
@emails = person.sent_emails(:include => [:recipient])
#in view
render @emails
# _email.html.erb partial
<h1><%= email.recipient.name %></h1>
<p>
<%= email.content %>
</p>
#still issues a select * for emails, N 1 for recipients :/
Комментарии:
1. Что находится внутри partial
_email
?2. Добавил это в вопрос
3.
email.recipient
Вызов должен выполнятьсяselect * from users
, если получатель не готов к загрузке. Вы уверены, что видитеselect * from emails
несколько раз?4. выбор * из электронных писем выполняется один раз, затем выполняется выбор * из people, где id = :recipient_id N раз
Ответ №1:
Я знаю, что это немного похоже на Rails 2ish, и может быть лучший способ Rails 3, но это работает.
@emails = person.sent_emails.find(:all, :include => :recipient)
Редактировать: Смотрите комментарий BaroqueBobcat для лучшего метода в Rails 3
Комментарии:
1. вы можете использовать
sent_emails.all(:include => :recipient)
2. Использовался синтаксис BaroqueBobcat — вот чего мне не хватало. Спасибо
3. Хорошо, итак, в этом примере у меня есть экземпляр Person. И я могу сделать «person.sent_emails.all(:включить => :получатель)». И это возвращает результат, который я ожидал. Но переменная person.sent_emails не изменилась. Как я могу загрузить эти ассоциации прямо внутри экземпляра ActiveRecord?