Rails after_save 不能使用 previous_changes

VincentJiang · 2015年04月15日 · 最后由 flypiggys 回复于 2015年04月15日 · 2619 次阅读

项目中希望 Model A某个字段(例如为 attr)保存成功后 touch 一下相关联的 Mobel B,所以尝试在 Model A中使用

after_save :touch_method, if: :attr_is_changed?

def touch_method
  ......
end

def attr_is_changed?
  previous_changes.include?(:attr)
end

查看网上一些资料发现,after_save 后,previous_changes 就会被置空了,所以attr_is_changed?一直都是返回 false 的。

请问大家有什么方法可以解决这个问题?

你的 rails 版本是?

先设定一个 before_save,定义一个实例变量记录下

before_save do
    @attr_has_changed = previous_changes.include?(:attr)
    return true
end

按理,save 以后,可以用对象的 previous_changes 看以前的变化记录; 但是,model 里面的 after_save 的回调里面,应该还是用 changes 来查看的; commit 以后,或者 after_commit 的回调里面,需要用 previous_changes 来查看; 你可以试下是否是这样的

#3 楼 @as181920 谢谢,根据你的提示,我用了 after_commit

#2 楼 @diudiutang 对于我所在的项目,不太适用,但还是谢谢!

after_save是在 commit 发生之前,你没 commit 呢当然 previous_changes 不起作用 另外你这个情况适合用

after_save :touch_method, if: ->(){ attr_changed? }
需要 登录 后方可回复, 如果你还没有账号请 注册新账号