使用存在时Rails N + 1查询?在ActiveRelation上

时间:2013-09-19 06:28:45

标签: ruby-on-rails activerecord ruby-on-rails-3.2

我有一个模型:

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查询问题?

1 个答案:

答案 0 :(得分:0)

作为参考,我最终通过以下方式解决了这个问题:

@events = Event.includes(:participants)

def attending?(user)
    participants.where('user_id = ?', user.id)
end