Esta es más una pregunta de "por qué las cosas funcionan de esta manera" en lugar de una pregunta de "No sé cómo hacer esto" ...
Entonces, el evangelio sobre extraer los registros asociados que sabe que va a usar es :include
porque obtendrá una combinación y evitará un montón de consultas adicionales:
Post.all(:include => :comments)
Sin embargo, cuando nos fijamos en los registros, no se produce una unión:
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)
Se está tomando un atajo porque tira todos los comentarios a la vez, pero todavía no es una unión (que es lo que toda la documentación parece decir). La única forma en que puedo obtener una combinación es usar en :joins
lugar de :include
:
Post.all(:joins => :comments)
Y los registros muestran:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
¿Me estoy perdiendo de algo? Tengo una aplicación con media docena de asociaciones y en una pantalla visualizo datos de todas ellas. Parece que sería mejor tener una consulta unida en lugar de 6 individuos. Sé que, en términos de rendimiento, no siempre es mejor hacer una unión en lugar de consultas individuales (de hecho, si va por el tiempo invertido, parece que las dos consultas individuales anteriores son más rápidas que la unión), pero después de todos los documentos He estado leyendo, me sorprende ver que :include
no funciona como se anuncia.
¿Quizás Rails es consciente del problema de rendimiento y no se une excepto en ciertos casos?
includes
(para cualquiera que lea esto)