我正在查看我的服务器日志,并且特定查询中有很多SELECT
个语句。我知道n+1问题,这似乎是一个问题。但是,我不确定此查询的解决方案是什么。这是针对返回的每个用户的单个查询还是多个(我相信WHERE
是单个查询)?
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)
感谢您的评论指出我正确的方向
答案 0 :(得分: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查询所有用户