簡體   English   中英

Rails 4 Eager Load has_many單個對象的關聯

[英]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查詢的方法,它們稱之為preloadeager_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM