我努力爲ActiveRecord對象找到includes()和preload()的比較。任何人都可以解釋這個區別嗎ActiveRecord查詢中的「includes」和「preload」有什麼區別?
回答
Rails有兩種避免n + 1問題的方法。其中一個涉及創建一個基於聯接的大查詢來引入您的關聯,另一個涉及爲每個關聯進行單獨的查詢。
當您做includes
時,rails會決定使用哪種策略。它默認爲單獨的查詢方法(預加載),除非它認爲您正在使用來自條件或訂單中的關聯的列。由於這隻適用於連接方法,所以它使用它。
Rails的啓發式檢查有時會出錯,或者您可能有一個偏好某種方法的特定原因。 preload
(及其配套方法eager_load
)允許您指定希望使用哪種策略。
正如apidoc所說:「此方法已被棄用或移到最新的穩定版本上,最新的現有版本(v3.0.9)顯示在這裏。」所以區別在於,只包括NOT不推薦。
'不推薦或移動'。在這種情況下,它已被移動,未被棄用。他們不一樣。 – 2012-08-14 07:03:39
對不起,但如果我有可能調用它(Rails 3.2.6),它不會移動我 - 只是棄用。 – freeze 2012-08-14 08:40:46
當人們將代碼從一個模塊重構到另一個模塊時,apidoc變得非常混亂 - 它可以認爲即使從公共api的角度來看,它也沒有移動 – 2012-08-14 11:16:08
詳細瞭解請參閱this博客。
在短褲:
預壓加載在一個單獨的查詢的關聯數據。
User.preload(:posts).to_a
# => SELECT "users".* FROM "users" SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN (1)
包括負載關聯數據在一個單獨的查詢就像 預緊力。然而,它是更智能比
preload
。但在某些情況下,它會結合查詢。
如何包括更聰明?
我們不能使用郵政局在哪裏條件。以下查詢將導致錯誤。
User.preload(:posts).where("posts.desc='ruby is awesome'")
# =>
SQLite3::SQLException: no such column: posts.desc:
SELECT "users".* FROM "users" WHERE (posts.desc='ruby is awesome')
但我們可以使用交表在查詢與包括
User.includes(:posts).where('posts.desc = "ruby is awesome"').to_a
# =>
SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, "posts"."id" AS t1_r0,
"posts"."title" AS t1_r1,
"posts"."user_id" AS t1_r2, "posts"."desc" AS t1_r3
FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"
WHERE (posts.desc = "ruby is awesome")
正如你可以看到包括使用兩個單獨的查詢,以創建一個單一LEFT OUTER開關JOIN得到數據。並且它也應用了提供的條件。
- 1. ActiveRecord查詢中的「includes」和「join」有什麼區別?
- 2. 子查詢和聯接的子查詢有什麼區別?
- 3. 2個SQL查詢有什麼區別?
- 4. 這兩個查詢有什麼區別?
- 5. 兩個查詢有什麼區別?
- 6. 這兩個查詢有什麼區別?
- 7. 這些LINQ查詢有什麼區別?
- 8. 這些查詢有什麼區別?
- 9. Elasticsearch GeoShape查詢中的CONTAINS和WITHIN有什麼區別?
- 10. SOLR中的過濾器和複雜查詢有什麼區別?
- 11. SQLite中UDF和保存的查詢之間有什麼區別?
- 12. 有什麼區別`和$(Bash中有什麼區別?
- 13. 輪詢和拉動有什麼區別?
- 14. 在ActiveRecord中,marked_for_detroy和destroy關聯記錄有什麼區別?
- 15. 在XPath查詢中使用「../」和「parent」有什麼區別?
- 16. 檢查和外鍵有什麼區別?
- 17. Mysql查詢。 Join和SubQuery有什麼區別?
- 18. LINQ查詢表達式和擴展方法有什麼區別
- 19. 藍牙服務發現和設備查詢有什麼區別?
- 20. qs和查詢字符串有什麼區別
- 21. 兩者有什麼區別? (查詢選擇和顯示結果)
- 22. 查詢和導入請求有什麼區別?
- 23. 閱讀查詢變量和正文變量有什麼區別?
- 24. ==和===有什麼區別?
- 25. ==和===有什麼區別?
- 26. 有什麼區別? :和||
- 27. ==和===有什麼區別?
- 28. '=='和'==='有什麼區別?
- 29. `&`和`ref`有什麼區別?
- 30. 有什麼區別:。!和:r!?
真棒 - 一個模糊的,沒有記錄的ActiveRecord角落。感謝閃耀一些光! – Phantomwhale 2012-08-15 05:57:35
此博客討論相同的主題http://blog.bigbinary。com/2013/07/01/preload-vs-eager-load-vs-joins-vs-includes.html – 2013-07-04 18:11:00
此博客文章非常有用和清晰http://blog.arkency.com/2013/12/rails4-預加載/ – 2014-06-10 10:14:58