Включает ли: работу с экземплярами ActiveRecord?

#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?