Rails after_save 不能使用 previous_changes

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

项目中希望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的。

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

共收到 7 条回复

你的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? }
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册