簡體   English   中英

用戶模型中的N + 1查詢

[英]N+1 query in user model

我的用戶模型中存在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?
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查詢之間的差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM