我使用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回调之前保存附件。这可能是回形针问题,不知道......
答案 0 :(得分:0)
在before_save
回调中,您可以使用构建的Rails来区分真实配置文件更改和与Authlogic相关的更改(last_request_at
和updated_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