用户模型中的N + 1查询

时间:2015-10-21 09:20:30

标签: ruby-on-rails

我的用户模型中存在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?

1 个答案:

答案 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控制台中使用joinsincludeseager_load,并检查生成的SQL查询的差异。