Non riesco a trovare un confronto tra include() e preload() per gli oggetti ActiveRecord. Qualcuno può spiegare la differenza?Qual è la differenza tra "include" e "preload" in una query di ActiveRecord?
risposta
Rails ha 2 modi per evitare il problema n + 1. Uno consiste nella creazione di una query basata su un grande join per inserire le associazioni, l'altra consiste nel creare una query separata per associazione.
Quando si eseguono le rotaie includes
, quale strategia utilizzare per l'utente. Il valore predefinito è l'approccio di query separato (preloading) a meno che non pensi di utilizzare le colonne delle associazioni nelle tue condizioni o ordine. Dal momento che funziona solo con l'approccio joins, utilizza quello invece.
L'euristica delle rotaie a volte sbaglia o si può avere una ragione specifica per preferire un approccio all'altro. preload
(e il relativo metodo companion eager_load
) consentono di specificare la strategia da utilizzare per le rotaie.
Come diceva apidoc "Questo metodo è obsoleto o spostato sull'ultima versione stabile. L'ultima versione esistente (v3.0.9) è mostrata qui." Quindi la differenza è che include solo NON deprecato.
"deprecato o spostato". In questo caso viene spostato, non deprecato. E non sono la stessa cosa. –
Scusa, ma se ho la possibilità di chiamarlo (Rails 3.2.6) non viene spostato per me, solo deprecato. – freeze
l'apidoc viene enormemente confuso quando le persone rifattorizzano il codice da un modulo a un altro - può pensare che un metodo si sia spostato anche dal punto di vista dell'API pubblico che non ha –
Per la comprensione dettagliata consultare il blog this.
In bicchierini:
precarico carica i dati associazione in una query separata.
User.preload(:posts).to_a
# => SELECT "users".* FROM "users" SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN (1)
Include carica i dati di associazione in una query separata, proprio come precarico. Tuttavia è più intelligente rispetto a
preload
. Ma in alcuni casi combina le query.
Come include è più intelligente?
noi non è possibile utilizzare la tabella postale in cui condizione. La seguente query genererà un errore.
User.preload(:posts).where("posts.desc='ruby is awesome'")
# =>
SQLite3::SQLException: no such column: posts.desc:
SELECT "users".* FROM "users" WHERE (posts.desc='ruby is awesome')
Ma noi possiamo usare tabella postale di cui interrogazione con includono
User.includes(:posts).where('posts.desc = "ruby is awesome"').to_a
# =>
SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, "posts"."id" AS t1_r0,
"posts"."title" AS t1_r1,
"posts"."user_id" AS t1_r2, "posts"."desc" AS t1_r3
FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"
WHERE (posts.desc = "ruby is awesome")
Come si può vedere include interruttori di utilizzare due query separate per la creazione di un unico SINISTRA Join esterno per ottenere il dati. E ha applicato anche la condizione fornita.
- 1. Qual è la differenza tra "include" e "join" nella query di ActiveRecord?
- 2. Qual è la differenza tra "include" e "anteporre" in Ruby?
- 3. Qual è la differenza tra @include e @match in userscripts?
- 4. Qual è la differenza tra "extends" e "include" in Jade?
- 5. Qual è la differenza tra "include", "estende" e "usa"?
- 6. Qual è la differenza tra require e include con php?
- 7. Erlang: qual è la differenza tra "include_lib" e "include"?
- 8. Qual è la differenza tra BatchGetItem e Query in DynamoDB?
- 9. Rails ActiveRecord: è una combinazione: include e: query condizioni possibili?
- 10. Differenza tra {% include '' %} e {{include ('')}} in Twig
- 11. Qual è la differenza tra DOMXPath :: evaluate e DOMXPath :: query?
- 12. Lucene: Qual è la differenza tra query e filtro
- 13. angolare 2.0 - Qual è la differenza tra @ViewQuery e @query
- 14. Qual è la differenza tra Fetch e Query?
- 15. In Rails, qual è la differenza tra find_each e dove?
- 16. Qual è la differenza tra <jsp: include page = ...> e <% @ include file = ...>?
- 17. differenza tra ActiveRecord e model() in yii?
- 18. Qual è la differenza tra più clausole MATCH e una virgola in una query Cypher?
- 19. Qual è la differenza tra una Seam e una Mock?
- 20. Qual è la differenza tra una filettatura e una fibra?
- 21. Qual è la differenza tra una monade e una chiusura?
- 22. Qual è la differenza tra dict() e {}?
- 23. Qual è la differenza tra una classe e una libreria?
- 24. Qual è la differenza tra Verilog! e ~?
- 25. Qual è la differenza tra una subroutine e una funzione?
- 26. Qual è la differenza tra ("") e (null)
- 27. Qual è la differenza tra {0} e ""?
- 28. Qual è la differenza tra una tupla e una compressa_pair?
- 29. Qual è la differenza tra = e: =
- 30. Qual è la differenza tra l'utilizzo? e% quando si disinfettano i campi in ActiveRecord?
Impressionante - un angolo oscuro e non documentato di ActiveRecord quello. Grazie per aver brillato un po 'di luce! – Phantomwhale
Questo blog discute lo stesso argomento http: //blog.bigbinary.it/2013/07/01/preload-vs-eager-load-vs-joins-vs-includes.html –
Questo post del blog è molto utile e chiaro http://blog.arkency.com/2013/12/rails4- precarico / –