在查询活动记录的位置避免使用n + 1

时间:2015-06-24 14:24:08

标签: ruby-on-rails ruby

我正在查看我的服务器日志,并且特定查询中有很多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)

感谢您的评论指出我正确的方向

1 个答案:

答案 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查询所有用户