【发布时间】:2011-03-21 21:43:38
【问题描述】:
我使用 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 记录用户 in,这会导致对某些字段(updated_at、token 等但不是个人资料图像)进行更新,从而导致 保存用户记录,在我的情况下导致 after_save 回调触发。这在保存回调后检查是否有 更改了用户的个人资料图片,这会不必要地消耗时间。
如果用户确实在尝试这样做,这很好 更新个人资料,但因为我在许多不同的地方使用 current_user 在我的应用程序中,这个回调被触发(而且它很昂贵 打电话),无缘无故。
我知道这不完全是 authlogic 问题,但无论如何我 可以避免这种情况,即不更新用户记录或以某种方式 区分什么是配置文件更新和什么是更新 从此 UserSession.find 登录产生的结果?
谢谢
这是基于 bjg 建议的有效解决方案。
before_save :check_what_changed
def check_what_changed 如果 self.changed.sort == ["last_request_at", "perishable_token"] self.skip_profile_update = true 返回真 别的 self.skip_profile_update = false 返回真 结尾 结束
更新 #2 我收回了没有用的那个,但是这个解决方案并不是真正的问题,出于某种原因,回形针甚至在 after_save 回调之前尝试保存附件。这可能是回形针问题,不知道..
【问题讨论】:
标签: ruby-on-rails performance callback authlogic