2009-12-17 10 views
6

Tengo un número de consultas personalizadas de find_by_sql en Rails. Me gustaría utilizar la carga ansiosa con ellos, pero no parece haber una buena manera de hacerlo.Los rieles añaden carga ansiosa personalizada

He visto el archivo eager_custom.rb flotando y parece que no funciona ahora con Rails. Parece que Rails ansia cargar de forma diferente ahora, usando 2 consultas (la consulta regular más una consulta donde el 'id IN' de los ID de la primera consulta), en lugar de la consulta de unión única utilizada en el pasado.

Mi pregunta es si realizo una consulta SQL personalizada, luego realizo la consulta 'id IN', ¿hay alguna manera de volver a agregar los objetos asociados a los resultados iniciales de la consulta?

Por ejemplo, tengo temas cargados con find_by_sql, luego encuentro imágenes de temas donde el id. De tema está en los id. De temas, ¿hay alguna manera de volver a agregar manualmente las imágenes a los temas?

Gracias

Respuesta

10

Como habrá notado, en Rails 2.1 un nuevo tipo de/pre-carga ansiosa se introdujo que utiliza varias consultas con id IN (...). Este método suele ser más rápido, especialmente cuando hay múltiples asociaciones precargadas. Puede usar esta funcionalidad manualmente con find_by_sql utilizando el método de clase preload_associations heredado de ActiveRecord (no recomendado). Por ejemplo:

class Person 
    def self.find_a_special_group 
    people = find_by_sql("...") 
    preload_associations(people, [:jobs, :addresses]) 
    return people 
    end 
end 

El método preload_associations está protegido, por lo que debe llamarlo desde dentro de la clase, y se necesita (1) una matriz de objetos, (2) una matriz, hachís, o símbolo de asociaciones (mismo formato que la opción find:include), y (3) un hash de opciones. Consulte la documentación del módulo ActiveRecord :: AssociationPreload :: ClassMethods para obtener más detalles.

Sin embargo, habiendo dicho todo eso, esta técnica es ciertamente indeseable ya que la documentación de Rails desalienta a los programadores a utilizar preload_associations directamente. ¿Estás seguro de que tienes que usar find_by_sql? ¿Estás seguro de que sabes todas las opciones que toma find? (:select, :from, :joins, :group, :having, etc.) No estoy diciendo que no necesite find_by_sql, pero puede valer la pena unos minutos para asegurarse.

+0

Esto es perfecto, muchas gracias. Preferiría no utilizar find_by_sql, pero tengo varias consultas muy complejas. – riley

+0

¡Gracias, Alex! – MikeMarsian

Cuestiones relacionadas