2009-12-17 3 views
6

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

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

Мой вопрос в том, что я делаю пользовательский SQL-запрос, а затем запрос 'ID IN', есть ли способ добавить обратно связанные объекты в исходные результаты запроса?

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

Благодаря

ответ

10

Как вы заметили, в 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) массив, хэш, или символ ассоциаций (в том же формате, что и find:include), и (3) хэш параметров. Подробнее см. Документацию для модуля ActiveRecord :: AssociationPreload :: ClassMethods.

Однако, сказав все это, этот метод, безусловно, нежелателен, поскольку документация Rails запрещает программистам напрямую использовать preload_associations. Вы уверены, что вам нужно использовать find_by_sql? Вы уверены, что знаете все варианты find? (:select, :from, :joins, :group, :having и т. Д.) Я не говорю, что вам не нужен find_by_sql, но это может стоить несколько минут, чтобы убедиться.

+0

Это прекрасно, спасибо большое. Я бы предпочел не использовать find_by_sql, но у меня есть ряд очень сложных запросов. – riley

+0

Спасибо, Алекс! – MikeMarsian

Смежные вопросы