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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top