C'est plus une question "pourquoi les choses fonctionnent de cette façon" plutôt qu'une question "je ne sais pas comment faire" ...
Donc, l'évangile sur l'extraction des enregistrements associés que vous savez que vous allez utiliser est d'utiliser :include
parce que vous obtiendrez une jointure et évitez tout un tas de requêtes supplémentaires:
Post.all(:include => :comments)
Cependant, lorsque vous regardez les journaux, aucune jointure ne se produit:
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)
Il est prend un raccourci car il tire tous les commentaires à la fois, mais il est toujours pas une jointure (qui est ce que toute la documentation semble dire). La seule façon d'obtenir une jointure est d'utiliser à la :joins
place de :include
:
Post.all(:joins => :comments)
Et les journaux montrent:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
Suis-je en train de manquer quelque chose? J'ai une application avec une demi-douzaine d'associations et sur un écran, j'affiche les données de chacune d'entre elles. Il semble qu'il serait préférable d'avoir une requête jointe au lieu de 6 individus. Je sais qu'en termes de performances, il n'est pas toujours préférable de faire une jointure plutôt que des requêtes individuelles (en fait, si vous passez par le temps passé, il semble que les deux requêtes individuelles ci-dessus soient plus rapides que la jointure), mais après tous les documents J'ai lu que je suis surpris de :include
ne pas travailler comme annoncé.
Peut-être que Rails est conscient du problème de performances et ne se joint pas, sauf dans certains cas?
includes
(pour tous ceux qui liront ceci)