Questa è più una domanda "perché le cose funzionano in questo modo" piuttosto che una domanda "Non so come fare" ...
Quindi il vangelo sull'estrazione di documenti associati che sai di usare sarà quello di usarlo :include
perché otterrai un join ed eviterai un sacco di domande extra:
Post.all(:include => :comments)
Tuttavia, quando si visualizzano i registri, non si verifica alcun join:
Post Load (3.7ms) SELECT * FROM "posts"
Comment Load (0.2ms) SELECT "comments.*" FROM "comments"
WHERE ("comments".post_id IN (1,2,3,4))
ORDER BY created_at asc)
Si sta prendendo una scorciatoia perché tira tutti i commenti in una sola volta, ma non è ancora un join (che è ciò che tutta la documentazione sembra dire). L'unico modo per ottenere un join è utilizzare :joins
invece di:include
:
Post.all(:joins => :comments)
E i registri mostrano:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
Mi sto perdendo qualcosa? Ho un'app con una mezza dozzina di associazioni e su uno schermo visualizzo i dati di tutte. Sembra che sarebbe meglio avere una query join-ed invece di 6 individui. So che dal punto di vista delle prestazioni non è sempre meglio fare un join piuttosto che singole query (in effetti se si passa dal tempo trascorso, sembra che le due singole query sopra siano più veloci del join), ma dopo tutti i documenti Ho letto sono sorpreso di vedere :include
non funziona come pubblicizzato.
Forse Rails è a conoscenza del problema delle prestazioni e non partecipa se non in alcuni casi?
includes
(per chiunque legga questo)