2015-06-24 84 views
0

我正在查看我的服務器日誌,並且有很多來自特定查詢的SELECT語句。我知道n+1問題,這似乎是一個。但是我不確定這個查詢的解決方案是什麼。這是一個單一的查詢或多個返回的每個用戶(我相信WHERE是一個單一的查詢)?避免n + 1在哪裏查詢活動記錄

User.where(profile_type: self.profile_type).where.not(id: black_list) 

編輯:

user.rb

def suggested_friends 
    black_list = self.friendships.map(&:friend_id) 
    black_list.push(self.id) 
    return User.where(profile_type: self.profile_type).where.not(id: black_list) 
    end 

index.json.jbuilder

json.suggested_friends @user.suggested_friends do |friend| 
    json.set! :user_id, friend.id 
    json.(friend.profile, *friend.profile.attributes.keys) 
end 

問題離開了includes(:profile)。使用下面的查詢解決我的問題

User.where(profile_type: self.profile_type).where.not(id: black_list).includes(:profile) 

,謝謝你的評論指出我在正確的方向

+2

你能發表更多的代碼嗎?在這種情況下自我是什麼?什麼是'black_list'?你是如何獲得black_list變量的? –

+0

什麼是self.profile_type和black_list? – gabrielhilal

+0

這將生成一個SQL查詢。但是,您可能會多次調用這一行代碼。我認爲你需要添加更多的上下文。 –

回答

0
User.where(profile_type: self.profile_type).where.not(id: black_list) 

只有1查詢,即使你有多個where條款,rails是明智的由它製作1 sql查詢。

如果你有

users = User.where(profile_type: self.profile_type) 
users.each do |u| 
    u.get_all_comments 
end 

這是N + 1個查詢,因爲你問所有users,然後爲每個user您做出新的請求爲其comments,這是N(查詢徵求意見)和1查詢所有用戶