You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 05:24:57