我有一个模型:
class Event
has_many :participations
has_many :participants, :through => :participations, :source => user
def attending?(user)
participants.exists?(user)
end
end
我在使用它时注意到了N + 1查询问题,例如:
@events = Event.all
@events.each_with_index do |event, i|
if (event.attending?(current_user))
...
end
end
我以为我可以通过使用includes来解决这个问题:
@events = Event.includes(:participants)
这不能解决N + 1查询问题。我对Ruby不太满意(这是一个副项目),但在调试ActiveRecord.FinderMethods.exists?
的代码时,我相信它总是构建一个新的关系&无论包含什么,都要对服务器执行此操作。
我对exists?
的解释是否正确?如果没有,我如何才能包含正确的内容,使exists?
不会出现N + 1查询问题?
答案 0 :(得分:0)
作为参考,我最终通过以下方式解决了这个问题:
@events = Event.includes(:participants)
和
def attending?(user)
participants.where('user_id = ?', user.id)
end