型號:如何在使用after_initialize回調時修復ActiveRecord(Rails 3)中的n + 1查詢問題?
class Project < ActiveRecord::Base
has_many :user_roles
after_initialize :add_user_roles
def add_user_roles
UserRoles.all.each do |ur|
self.user_roles << ur unless self.user_roles.include?(ur)
end
end
end
聲明說找到項目:
@projects = Project.includes(:user_roles)
所以你可以看到,我告訴它包括在查詢中的用戶角色關聯。但是,我仍然看到n + 1個查詢問題:它爲每個項目找到一次角色。
如果我從回調中刪除了self.user_roles
的用法並查看日誌,我可以看到它在2個查詢中找到項目及其用戶角色 - 一個用於項目,另一個用於角色project_id in (1,2,3,4,5...,n)
。
有沒有辦法解決這個問題?
讓我澄清一點:雖然我願意根據需要解決具體情況,但我更喜歡關注如何解決問題的答案。我有能力編寫一個kludge來獲取我想要的狀態的數據,而不使用after_initialize回調,因此不會進入n + 1查詢問題。不過,我寧願不這樣做,所以我更喜歡回答一般問題,而不是我的具體例子。
它已經足夠長,我不記得*爲什麼*。我認爲這可能是因爲角色是可以複製到項目中的全系統模型,並且名稱在那裏發生了變化,所以是有可能缺失的HABTM反映了這一點。 –
在任何情況下,由於存在Rails問題,並且它看起來不會「固定」,所以我會接受這是正確的答案:不可能。 –