Rails добавить настраиваемую нагрузку - PullRequest
6 голосов
/ 18 декабря 2009

У меня есть несколько пользовательских запросов find_by_sql в Rails. Я хотел бы использовать их с нетерпением, но, похоже, нет хорошего способа сделать это.

Я видел, как файл eager_custom.rb плавал вокруг, и сейчас он не работает с Rails. Похоже, что Rails теперь загружается по-другому, используя 2 запроса (обычный запрос плюс запрос, где «id IN» - идентификаторы из первого запроса), вместо одного запроса на соединение, использовавшегося в прошлом.

У меня вопрос: если я сделаю собственный запрос SQL, а затем запрос 'id IN', есть ли способ добавить обратно связанные объекты в результаты первоначального запроса?

Например, у меня есть темы, загруженные с помощью find_by_sql, затем я нахожу изображения тем, где идентификатор темы находится в идентификаторах тем, есть ли способ добавить изображения вручную обратно в темы?

Спасибо

1 Ответ

10 голосов
/ 18 декабря 2009

Как вы заметили, в 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, но это может стоить нескольких минут, чтобы убедиться.

...