我在模型上有一个 after_save 回调,我正在调用 previous_changes 来查看属性 (is_complete) 是否发生了变化。即使属性发生变化,previous_changes 也会返回一个空哈希。
这是回调:
after_save do |record|
puts "********************"
puts record.previous_changes.to_s
puts record.is_complete
puts "********************"
end
这是我在日志中得到的:
********************
{}
true
********************
********************
{}
false
********************
如果 is_complete 的值从 true 变为 false,它应该在 previous_changes 哈希中。更新是通过正常保存完成的!而且我没有重新加载对象。
---更新---
当我发布这个问题时,我没有考虑到这一点,但我的模型使用了 awesome_nested_set gem,看起来这正在重新加载对象或以某种方式干扰 after_save 回调。当我注释掉acts_as_nested_set 时,回调似乎工作正常。
---更新 2 ---
使用 around_save 回调修复了这个问题,该回调首先确定属性是否更改,然后生成,然后在数据库中进行更改后执行我需要它执行的操作。工作解决方案如下所示:
around_save do |record, block|
is_complete_changed = true if record.is_complete_changed?
block.call
if is_complete_changed
** do stuff **
end
end