2011-02-01 10 views

Respuesta

22

:joins une tablas juntos en sql, :includes asociaciones cargas deseosos de evitar la n + 1 problema (donde se ejecuta una consulta para recuperar el registro y, a continuación uno por asociación que se carga).

Le sugiero que lea sus secciones en Rails Guides para obtener más información.

4

Las uniones se unirán a las tablas y traerán los campos seleccionados a cambio. si llama a asociaciones en el resultado de la consulta de uniones, activará las consultas de la base de datos

Incluir cargará las asociaciones incluidas y las agregará a la memoria. Incluye cargas de todos los atributos de tablas incluidos. Si se llama a las asociaciones de incluir resultado de la consulta, no lo puedo disparar cualquier consulta

puede encontrar una explicación detallada con ejemplos en Active Recrod Associations Tips & Tricks

3

: une devuelve objetos de sólo lectura,: incluye no hace

: se une a usos unión interna,: incluye usos combinación externa.

la razón principal de: includes es la carga ansiosa, para evitar el problema N + 1 de la carga en los atributos de cada objeto mediante una consulta separada.

27
stores = Store.joins(:car) 

Esto devolverá todas las tiendas para las que haya un automóvil. stores[0].car dará lugar a otra consulta.

stores = Store.includes(:car) 

Esto devolverá todas las tiendas, automóvil o no. stores[0].carno resultado en otra consulta.

stores = Store.includes(:car).joins(:car) 

Esto devolverá todas las tiendas con un automóvil. stores[0].carno resultado en otra consulta. No recomendaría esto para las relaciones has_many, pero funciona muy bien para has_one.

0

TL; DR

Combinaciones:

a.joins(:b).to_sql 
=> "SELECT \"a\".* FROM \"a\" INNER JOIN \"b\" ON \"b\".\"id\" = \"a\".\"b_id\"" 

Incluye:

a.includes(:b).to_sql 
=> "SELECT \"a\".* FROM \"a\" 

Ambos:

a.includes(:b).joins(:b).to_sql 
=> "SELECT \"a\".\"id\" AS t0_r0, \"a\".\"a_field_1\" AS t0_r1, \"a\".\"a_field_2\" AS t0_r2, \"a\".\"a_field_3\" AS t0_r3, \"b\".\"a_field_1\" AS t1_r1, \"b\".\"a_field_2\" AS t1_r2, \"b\".\"a_field_3\" AS t1_r3 FROM \"a\" INNER JOIN \"b\" ON \"b\".\"id\" = \"a\".\"plan_id\"" 
Cuestiones relacionadas