我的用户模型中存在N + 1问题,我不确定如何修复。该方法设置如下:
has_many :group_questions, through: :groups, source: :questions
has_many :question_participants, as: :questionable
has_many :questions, through: :question_participants
# Collection of Users questions
def all_questions
group = group_questions
personal = questions
all_questions = group + personal
end
它收集与用户所在群体相关的问题,以及针对该人的个人问题。最后,它将它们合并为一个数组。
我得到的N + 1是:
N+1 Query detected
User => [:group_questions]
Add to your finder: :includes => [:group_questions]
User => [:questions]
Add to your finder: :includes => [:questions]
发生在这一行:
current_user.all_questions.any?
答案 0 :(得分:1)
class User
scope :with_questions, -> { includes(:questions, :group_questions) }
def all_questions
# No need for variables if you only use them once!
group_questions + questions
end
end
def show
@user = User.with_questions.find(params[:id])
end
您可以使用default_scope
,但这不是一个好主意,因为它会减慢您不需要加入记录的情况。
我刚看到您关于从current_user
获取用户的评论。尽管在一个查询中加载所有内容将是最佳的,但是在身份验证逻辑中加载用户的加载对于边际性能增益来说是一团糟。相反,你可以这样做:
@user = User.eager_load(:questions, :group_questions)
.find(current_user.id)
eager_load
将强制ActiveRecord在单个查询中预先加载记录。尝试在rails控制台中使用joins
,includes
和eager_load
,并检查生成的SQL查询的差异。