[英]Rails 4 Eager Load has_many Associations for single object
當獲取具有相關記錄的對象數組時,我獲得了使用預先加載來避免N + 1的好處,但是在獲取單個記錄時使用預先加載是否很重要?
就我而言
user has_many :addresses
user has_many :skills
user has_many :devices
user has_many :authentications
在show動作中,我試圖用機架迷你探測器看看是否有趣使用急切加載
User.includes(:skills, :addresses, :devices, :authentications).find(params[:id])
但我似乎有相同數量的SQL請求..
有關使用預先加載此類案件的建議嗎?
獲取單個記錄時使用預先加載是否很重要?
對於一級深層的協會,沒有。
如果你有嵌套關聯,是的。
# class User
has_many :skills
# class Skill
belongs_to :category
# this code will fire N + 1 queries for skill->category
user.skills.each do |skill|
puts skill.category
end
在這種情況下,最好是熱切的加載skills: :category
User.includes(skills: :category).find(id)
編輯
Rails提供了兩種避免N + 1查詢的方法,它們稱之為preload
和eager_load
。
預加載會為每個集合觸發單個SQL查詢。
急切加載嘗試構造一個大型左連接SELECT以檢索1個查詢中的所有集合。
簡短版本includes
讓Rails選擇使用哪一個。 但你可以強迫這種或那種方式。
User.eager_load(:skills, :addresses, :devices, :authentications).find(params[:id])
應檢索1個查詢中的所有記錄。
進一步閱讀 :
嘗試使用Bullet gem來檢測未使用或缺少的預先加載。 它旨在告訴您是否存在浪費的include
語句或低效的N + 1查詢,其中includes
有幫助。
如果出現問題,可以將其配置為輸出到Rails記錄器以通知您。 或者,您可以在瀏覽器中向您顯示需要優化的頁面上的通知。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.