2011-02-01 63 views

回答

22

:joins聯接表一起在SQL中,:includes急於負載關聯,以避免第n + 1個問題(其中執行一個查詢以檢索記錄,然後每一個相關聯,其被加載)。

我建議你閱讀他們在Rails Guides的部分以獲取更多信息。

4

聯接只會加入表格並返回選定的字段。如果您在連接查詢結果上調用關聯,它將再次觸發數據庫查詢

包括將加載包含的關聯並將它們添加到內存中。包含加載所有包含的表格屬性。如果你調用協會對包括查詢結果,它不會觸發任何疑問

你可以找到例子詳細解釋Active Recrod Associations Tips & Tricks

3

:加入只讀對象的回報,:包括不

:加入用途內部連接,包括使用外部連接。

主要原因包括:渴望加載,避免使用單獨的查詢加載每個對象的屬性的N + 1問題。

27
stores = Store.joins(:car) 

這將返回所有有車的商店。 stores[0].car將導致另一個查詢。

stores = Store.includes(:car) 

這將返回所有商店,汽車或沒有汽車。 stores[0].car而不是導致另一個查詢。

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

這將返回所有商店與汽車。 stores[0].car而不是導致另一個查詢。我不會推薦這個has_many關係,但它對has_one很好。

0

TL; DR

連接:

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

包括:

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

兩個:

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\"" 
相關問題