Rails aggiungono carico desiderosi personalizzato
-
20-09-2019 - |
Domanda
Ho un numero di query find_by_sql personalizzate in Rails. Vorrei utilizzare eager loading con loro, ma non sembra essere un buon modo per farlo.
ho visto il file eager_custom.rb galleggianti intorno e non sembra funzionare con Rails ora. Esso appare Rails fa eager loading in modo diverso ora, utilizzando 2 interrogazioni (query regolare più una query in cui l' 'id IN' gli ID dalla prima query), anziché la query join singolo utilizzato in passato.
La mia domanda è se faccio una query SQL personalizzata, quindi fare 'id IN' interrogazione, c'è un modo per aggiungere di nuovo gli oggetti associati nei risultati della query iniziali?
Per esempio io ho temi carichi di find_by_sql, poi trovare le immagini argomento dove l'argomento id è negli argomenti ids, c'è un modo per aggiungere manualmente le immagini di nuovo ai temi?
Grazie
Soluzione
Come avrete notato, in Rails 2.1 è stato introdotto un nuovo tipo di ansiosi / pre-caricamento che utilizza query multiple con id IN (...)
. Questo metodo è solitamente più veloce, soprattutto quando ci sono più associazioni in fase di pre-caricati. È possibile utilizzare questa funzionalità manualmente con find_by_sql
utilizzando il metodo della classe preload_associations
ereditato da ActiveRecord (non raccomandato). Ad 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 (stesso formato di opzione find
di :include
) e (3) un hash opzioni. Vedere la documentazione per il modulo ActiveRecord :: :: AssociationPreload ClassMethods per maggiori dettagli.
Tuttavia, dopo aver detto tutto questo, questa tecnica è certamente auspicabile la documentazione Rails scoraggia i programmatori di utilizzare direttamente preload_associations
. Sei sicuro è necessario utilizzare find_by_sql
? Sei sicuro di sapere tutte le opzioni find
prende? (:select
, :from
, :joins
, :group
, :having
, ecc) non sto dicendo che non è necessario find_by_sql
, ma forse vale la pena un paio di minuti per assicurarsi.