【发布时间】:2020-06-30 07:53:48
【问题描述】:
我正在开发一个应用程序,其中我有一个用户模型,该模型具有 默认范围
default_scope { preload(:preference, :permission, :user_detail, :log) }
每次调用 current_user 都会触发 4 个查询
对于current_user,我已经覆盖了设计
module DeviseOverrides
def self.included(base)
base.class_eval {
alias_method :devise_current_user, :current_user
helper_method :current_user, :user_signed_in?
}
base.send(:include, InstanceMethods)
end
module InstanceMethods
def current_user
@current_user ||= warden.try(:user) || anonymous_user
end
def user_signed_in?
warden.user.present?
end
end
end
假设我们在一个页面上有 5 个模块。并加载我们触发 ajax 调用的每个模块。基本上我们会触发 5 个请求。现在,对于每 5 个请求,@current_user 第一次将为零,它会触发一个查询。同样,当我们在同一个请求中调用 current_user 时,它将从缓存中返回。
我想要的是第一个请求应该触发查询并存储在@current_user 中。稍后对于页面中的所有其他请求,它应该从缓存中返回而不是触发查询
@current_user ||= warden.try(:user) || anonymous_user
warden.user.present?
谁能指导我需要做什么
class ApplicationController < ActionController::Base
around_action :set_current_user
def set_current_user
User.current = current_user
yield
ensure
User.current = nil
end
end
class User < ApplicationRecord
default_scope { preload(:preference, :permission, :user_detail, :log)
def self.current=(user)
Thread.current[:current_user] = user
end
def self.current
Thread.current[:current_user]
end
end
根据@kgilpin 的建议,我更新了我的 application_controller 方法
def set_current_user
User.current = warden.try(:user) || anonymous_user
yield
ensure
User.current = nil
end
【问题讨论】:
标签: ruby-on-rails ruby devise ruby-on-rails-5.2