有没有办法撤消/恢复对 Activerecord 对象的任何本地更改。例如:
user = User.first
user.name # "Fred"
user.name = "Sam"
user.name_was # "Fred"
user.revert
user.name # "Fred"
我知道我可以这样做user.reload
,但我不应该访问数据库来执行此操作,因为旧值存储在对象的状态中。
最好是 Rails 3 解决方案。
有没有办法撤消/恢复对 Activerecord 对象的任何本地更改。例如:
user = User.first
user.name # "Fred"
user.name = "Sam"
user.name_was # "Fred"
user.revert
user.name # "Fred"
我知道我可以这样做user.reload
,但我不应该访问数据库来执行此操作,因为旧值存储在对象的状态中。
最好是 Rails 3 解决方案。
如this answer中所述, Rails 4.2 引入了以下restore_attributes
方法ActiveModel::Dirty
:
user = User.first
user.name # "Fred"
user.status # "Active"
user.name = "Sam"
user.status = "Inactive"
user.restore_attributes
user.name # "Fred"
user.status # "Active"
如果要恢复特定属性,restore_attribute!
可以使用:
user.name = "Sam"
user.status = "Inactive"
user.restore_name!
user.name # "Fred"
user.status # "Inactive"
如果有人在这里结束,restore_attributes 是从 rails 4.2 开始的方法:
http://api.rubyonrails.org/classes/ActiveModel/Dirty.html#method-i-restore_attributes
您可以遍历“更改”并重置它们。可能有一种方法可以做到这一点,但我没有看。
> c = Course.first
> c.name
=> "Athabasca Country Club"
> c.name = "Foo Bar"
=> "Foo Bar"
> c.changes
=> {"name"=>["Athabasca Country Club", "Foo Bar"]}
> c.changes.each {|k,vs| c[k] = vs.first}
> c.name
=> "Athabasca Country Club"
实际上看起来有一个“name_reset!” 你可以调用的方法...
> c.changes.each {|k,vs| c.send("#{k}_reset!")}