2011-02-01 1 views

risposta

22

:joins unisce tavoli insieme a SQL, :includes associazioni carichi desiderosi di evitare il problema n + 1 (in cui una query viene eseguita per recuperare il record e poi uno per ogni associazione che è caricato).

Suggerisco di leggere le loro sezioni in Rails Guides per ottenere maggiori informazioni.

4

I join si uniranno alle tabelle e restituiranno campi selezionati. se chiamate le associazioni sul risultato della query joins, si attiveranno nuovamente le query del database

Includi caricheranno le associazioni incluse e le aggiungeranno in memoria. Includi carica tutti gli attributi delle tabelle incluse. Se si chiama associazioni sulla includere risultato della query, non ci vorrà sparare qualsiasi domanda

Si possono trovare spiegazione dettagliata di esempi in Active Recrod Associations Tips & Tricks

3

: unisce i rendimenti di sola lettura oggetti,: include non lo fa

: unisce usi inner join,: include usa outer join.

il motivo principale di: include è caricamento impaziente, per evitare il problema N + 1 di caricamento in attributi di ciascun oggetto utilizzando una query separata.

27
stores = Store.joins(:car) 

In questo modo verranno restituiti tutti i negozi per cui esiste un'automobile. stores[0].car genererà un'altra query.

stores = Store.includes(:car) 

Questo restituirà tutti i negozi, auto o nessuna macchina. stores[0].car sarà non risultato in un'altra query.

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

Questo restituirà tutti i negozi con una macchina. stores[0].car sarà non risultato in un'altra query. Non lo consiglierei per le relazioni has_many, ma funziona perfettamente per has_one.

0

TL; DR

entra a far parte:

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

Include:

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

Entrambi:

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\""