Ce n'est plus un "pourquoi les choses fonctionnent de cette façon" question plutôt que d'un "je ne sais pas comment faire"...
L'évangile à tirer sur les dossiers que vous savez que vous allez utiliser est d'utiliser :include
parce que vous obtiendrez une jointure et d'éviter tout un tas de requêtes supplémentaires:
Post.all(:include => :comments)
Toutefois, lorsque vous regardez les journaux, il n'y a pas de jointure qui se passe:
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)
C' est en prenant un raccourci, car il rassemble tous les commentaires à la fois, mais il n'est pas encore une jointure (qui est ce que l'ensemble de la documentation semble dire). La seule façon que je peux obtenir une jointure est d'utiliser :joins
au lieu de :include
:
Post.all(:joins => :comments)
Et les journaux:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
Ai-je raté quelque chose? J'ai une application avec une demi-douzaine d'associations et sur un écran, je l'affichage des données de tous. Me semble qu'il serait mieux d'avoir un rejoignez-ed requête au lieu de 6 personnes. Je sais que la performance sage, il n'est pas toujours mieux de faire une jointure plutôt que de requêtes individuelles (en fait, si vous allez par le temps passé, il semble que deux requêtes individuelles ci-dessus sont plus rapides que la jointure), mais après tous les docs que j'ai lu, je suis surpris de voir :include
ne fonctionne pas comme annoncé.
Peut-être que Rails est conscient du problème de performances et de ne pas participer, sauf dans certains cas?