如何在Rails中调用reload时保留model实例的saved_changes?
在Rails中reload实例但保留saved_changes的方案
当然可以实现你的需求,不需要修改Rails原生行为,这里有两种实用的方案:
方案一:手动保存并恢复变更记录
先把当前的saved_changes复制一份,执行reload后再将其恢复到实例中:
user = User.first user.update(first_name: "New name") # 复制当前的变更记录 saved_changes_backup = user.saved_changes.dup # 重新加载实例 user.reload # 恢复变更记录到实例 user.instance_variable_set(:@saved_changes, saved_changes_backup) user.saved_changes # => {"first_name"=>["John", "New name"]}
原理是:saved_changes的数据实际存储在实例变量@saved_changes中,reload会重置这个变量,我们通过手动备份再赋值的方式,就能保留之前的变更记录。
方案二:自定义保留变更的reload方法
如果需要频繁使用,可以在Model中定义一个自定义方法,避免重复编写备份逻辑:
class User < ApplicationRecord def reload_preserve_changes # 备份变更记录 changes_backup = saved_changes.dup # 执行原生reload reload # 恢复变更记录 instance_variable_set(:@saved_changes, changes_backup) # 返回实例本身,支持链式调用 self end end
使用时直接调用自定义方法即可:
user = User.first user.update(first_name: "New name") user.reload_preserve_changes.saved_changes # => {"first_name"=>["John", "New name"]}
这两种方案都没有修改Rails原生的reload方法,只是在其基础上补充了变更记录的备份与恢复逻辑,完全符合你的需求。
内容的提问来源于stack exchange,提问作者adrianorob
相关产品推荐
相关产品推荐

