authlogic current_user跟踪

时间:2010-07-27 23:56:52

标签: ruby-on-rails performance callback authlogic

我使用authlogic进行身份验证和回形针来处理用户的个人资料图片附件。

我使用以下方法获取current_user

    def current_user_session
        return @current_user_session if defined?
(@current_user_session)
        @current_user_session = UserSession.find
    end

def current_user
        return @current_user if defined?(@current_user)
        @current_user = current_user_session &&
current_user_session.record
    end

以及后续的after_save回调,以便在图像发生变化时重新生成配置文件图像。

   after_save do |user|
        if user.image_changed?
            Delayed::Job.enqueue ImageJob.new(user.id)
        end
    end

current_user方法发出UserSession.find调用和 查看文档似乎是UserSession.tries来记录用户 在,导致更新某些字段(updated_at,令牌等但不是配置文件图像),这导致a 保存用户记录,在我的情况下导致after_save 回调射击。保存回调后检查是否有 是对用户个人资料图片的更改,这会不必要地消耗时间。

现在,如果用户确实在尝试,这很好 更新配置文件,但因为我在许多不同的地方使用current_user 在我的应用程序中,这个回调被解雇了(而且它很昂贵 电话),无缘无故。

我知道这不是authlogic问题,但无论如何我都知道 可以避免这种情况,即不更新用户记录或以某种方式 区分什么是配置文件更新和什么是更新 这个UserSession.find登录产生了什么?

谢谢

以下是基于bjg建议的解决方案。

before_save:check_what_changed

def check_what_changed     if self.changed.sort == [“last_request_at”,“perishable_token”]         self.skip_profile_update = true         返回true     其他         self.skip_profile_update = false         返回true     结束 端

更新#2 我把它拿回去了,但是这个解决方案确实不是问题,因为某些原因,paperclip试图在after_save回调之前保存附件。这可能是回形针问题,不知道......

2 个答案:

答案 0 :(得分:0)

before_save回调中,您可以使用构建的Rails来区分真实配置文件更改和与Authlogic相关的更改(last_request_atupdated_at属性) -in脏对象跟踪设施。沿着这些方向的东西

attr_accessor :skip_profile_update

before_save do |model|
  model.skip_profile_update = (model.changed.sort == ['last_request_at', 'updated_at'])
end

after_save do |model|
  unless model.skip_profile_update
    # etc
  end
end

答案 1 :(得分:0)

我遇到了bjg解决方案的问题,因为有时候我只会得到'last_request_at'而不是'updated_at',所以skip_profile_update会是假的。

我把它改成了这个白名单的字段列表,它应该触发after_save,而不是黑名单方法。通过更改array comparison method,可以轻松将其更改为黑名单。我还发现有必要包括所有'真实的,因为我得到那些可怕的“ActiveRecord记录未保存”错误,否则。

attr_accessor :record_activity

before_save do |user|
    user.record_activity = (user.changed & ['email', 'birthday', 'zip', 'gender']).present?
    true
  end

  after_update do |user|
    if user.record_activity
     user.send(:record_update_activity)
     true
    end
    true
  end