Я работаю в Rails 3.0.7.
У меня есть несколько ассоциаций "многие ко многим" и "один ко многим", которые не в состоянии увеличить нагрузку.
Мои ассоциации:
Person has_many :friends
Person has_many :locations through=> :location_histories
Location belongs_to :location_hour
Location_hour has_many :locations
В моем контроллере у меня есть следующее:
@people = Person.includes([[:locations=>:location_hour],:friends]).where("(location_histories.current = true) AND (people.name LIKE ? OR friends.first_name LIKE ? OR friends.last_name LIKE ? OR (friends.first_name LIKE ? AND friends.last_name LIKE ?))").limit(10).all
Тогда, на мой взгляд, у меня есть:
<% @people.each do |person| %>
<tr>
<td><%= link_to person.name, person %></td>
<td><%= link_to person.friends.collect {|s| [s.full_name]}.join(", "), person.friends.first %></td>
<td><%= link_to person.locations.current.first.name, person.locations.current.first %></td>
</tr>
<% end %>
location.current - это область действия, определенная как:
scope :current, lambda {
where("location_histories.current = ?", true)
}
Это работает, как ожидалось, и сначала генерирует 2 вызова базы данных: один для получения списка идентификаторов людей, а затем большой вызов базы данных, где все правильно объединено. ПРОБЛЕМА заключается в том, что после этого происходит n обращений к базе данных по направлениям:
SELECT 'friends'.* from 'friends' WHERE ('friends'.person_id = 12345)
Так для каждой итерации цикла в представлении. Излишне говорить, что это занимает некоторое время.
Я думал, что .всего вызовет нетерпеливую загрузку. У кого-нибудь есть идея, что здесь происходит?
Это тратит более 3 секунд на ActiveRecord. Слишком долго.
Буду очень признателен за любые предложения.
Спасибо.