ActiveRecord查詢中「包括」和「加入」有什麼區別?任何人都可以向我解釋以下兩種相關模型嗎?ActiveRecord查詢中的「includes」和「join」有什麼區別?
class Car < ActiveRecord::Base
belongs_to :store
end
class Store < ActiveRecord::Base
belongs_to :owner
has_one :car
end
ActiveRecord查詢中「包括」和「加入」有什麼區別?任何人都可以向我解釋以下兩種相關模型嗎?ActiveRecord查詢中的「includes」和「join」有什麼區別?
class Car < ActiveRecord::Base
belongs_to :store
end
class Store < ActiveRecord::Base
belongs_to :owner
has_one :car
end
:joins
聯接表一起在SQL中,:includes
急於負載關聯,以避免第n + 1個問題(其中執行一個查詢以檢索記錄,然後每一個相關聯,其被加載)。
我建議你閱讀他們在Rails Guides的部分以獲取更多信息。
聯接只會加入表格並返回選定的字段。如果您在連接查詢結果上調用關聯,它將再次觸發數據庫查詢
包括將加載包含的關聯並將它們添加到內存中。包含加載所有包含的表格屬性。如果你調用協會對包括查詢結果,它不會觸發任何疑問
你可以找到例子詳細解釋Active Recrod Associations Tips & Tricks
:加入只讀對象的回報,:包括不
:加入用途內部連接,包括使用外部連接。
主要原因包括:渴望加載,避免使用單獨的查詢加載每個對象的屬性的N + 1問題。
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
很好。
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\""