Rails:incluir vs:une
Esta es más una pregunta de "por qué funcionan las cosas de esta manera" en lugar de una pregunta de "No se cómo hacer esto"...
Así que el evangelio sobre la extracción de registros asociados que sabes que vas a usar es usar :include
porque obtendrás una unión y evitarás un montón de consultas adicionales:
Post.all(:include => :comments)
Sin embargo, cuando usted mira los registros, no hay join sucediendo:
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)
It está tomando un atajo porque extrae todos los comentarios a la vez, pero todavía no es un join (que es lo que parece decir toda la documentación). La única forma en que puedo obtener un join es usar :joins
en 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 algo? Tengo una aplicación con media docena de asociaciones y en una pantalla muestro datos de todas ellas. Parece que sería mejor tener una consulta join-ed en lugar de 6 personas. Sé que en cuanto al rendimiento, no siempre es mejor hacer un join en lugar de consultas individuales (de hecho, si vas por el tiempo empleado, parece que las dos consultas individuales anteriores son más rápidas que la unión), pero después de todos los documentos que he estado leyendo me sorprende ver :include
no funciona como se anuncia.
Tal vez Rails es consciente del problema de rendimiento y no se une excepto en ciertos casos?
Warning: Undefined property: agent_blog_content::$date_asked in /var/www/agent_etc/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 32
Warning: Undefined property: agent_blog_content::$count_answers in /var/www/agent_etc/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 52