Как вы заметили, в Rails 2.1 был введен новый тип загрузки / предварительной загрузки, который использует несколько запросов с id IN (...)
. Этот метод обычно быстрее, особенно когда предварительно загружено несколько ассоциаций. Вы можете использовать эту функцию вручную с find_by_sql
, используя метод класса preload_associations
, унаследованный от ActiveRecord (не рекомендуется). Например:
class Person
def self.find_a_special_group
people = find_by_sql("...")
preload_associations(people, [:jobs, :addresses])
return people
end
end
Метод preload_associations
защищен, поэтому вы должны вызывать его из класса, и он принимает (1) массив объектов, (2) массив, хэш или символ ассоциаций (в том же формате, что и * 1008) * 's :include
option) и (3) хеш опций. См. Документацию для модуля ActiveRecord :: AssociationPreload :: ClassMethods для получения более подробной информации.
Однако, сказав все это, этот метод, безусловно, нежелателен , поскольку документация Rails не рекомендует программистам использовать preload_associations
напрямую. Вы уверены, что должны использовать find_by_sql
? Вы уверены, что знаете все опции, которые принимает find
? (:select
, :from
, :joins
, :group
, :having
и т. Д.) Я не говорю, что вам не нужно find_by_sql
, но это может стоить нескольких минут, чтобы убедиться.