2009-12-17 14 views
6

Ho un numero di query find_by_sql personalizzate in Rails. Mi piacerebbe usare il caricamento avido con loro ma non sembra essere un buon modo per farlo.I binari aggiungono carico personalizzato eager

Ho visto il file eager_custom.rb fluttuare e non sembra funzionare con Rails ora. Sembra che Rails ora stia caricando in modo diverso, usando 2 query (la query regolare più una query in cui 'id IN' gli ID della prima query), invece della query di join singolo utilizzata in passato.

La mia domanda è se faccio una query SQL personalizzata, quindi faccio la query 'id IN', c'è un modo per aggiungere gli oggetti associati ai risultati della query iniziale?

Ad esempio, ho degli argomenti caricati con find_by_sql, quindi trovo le immagini degli argomenti in cui l'id dell'argomento si trova negli id ​​degli argomenti, c'è un modo per aggiungere manualmente le immagini agli argomenti?

Grazie

risposta

10

Come avrete notato, in Rails 2.1 un nuovo tipo di ansiosi/pre-caricamento è stato introdotto, che utilizza più query con id IN (...). Questo metodo è in genere più veloce, soprattutto quando sono presenti più associazioni in fase di precaricamento. È possibile utilizzare questa funzionalità manualmente con find_by_sql utilizzando il metodo di classe preload_associations ereditato da ActiveRecord (non consigliato). Per esempio:

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

Il metodo preload_associations è protetto, quindi è necessario chiamare dall'interno della classe, e ci vuole (1) un array di oggetti, (2) un array, hash, o un simbolo di associazioni (lo stesso formato dell'opzione) e (3) un hash delle opzioni. Consultare la documentazione del modulo ActiveRecord :: AssociationPreload :: ClassMethods per ulteriori dettagli.

Tuttavia, dopo aver detto tutto questo, questa tecnica è certamente auspicabile la documentazione Rails scoraggia i programmatori di utilizzare preload_associations direttamente. Sei sicuro di dover usare find_by_sql? Sei sicuro di sapere tutte le opzioni find? (:select, :from, :joins, :group, :having, ecc.) Non sto dicendo che non è necessario find_by_sql, ma potrebbe valere alcuni minuti per essere sicuro.

+0

Questo è perfetto, grazie mille. Preferirei non usare find_by_sql ma ho un numero di query molto complesse. – riley

+0

Grazie, Alex! – MikeMarsian

Problemi correlati