如何还原/撤消对Activerecord对象的本地更改?

时间:2013-09-06 17:50:41

标签: ruby-on-rails ruby activerecord

是否有办法撤消/恢复对Activerecord对象的任何本地更改。例如:

user = User.first
user.name # "Fred"
user.name = "Sam"
user.name_was # "Fred"

user.revert
user.name # "Fred"

我知道我可以做user.reload但我不必点击数据库来执行此操作,因为旧值存储在对象的状态中。

优选Rails 3解决方案。

4 个答案:

答案 0 :(得分:15)

如果有人在这里结束,restore_attributes是从rails 4.2开始的方式:

http://api.rubyonrails.org/classes/ActiveModel/Dirty.html#method-i-restore_attributes

答案 1 :(得分:13)

正如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"

答案 2 :(得分:8)

您可以循环浏览“更改”并重置它们。可能有一种方法可以做到这一点,但我没有看。

> 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!")}

答案 3 :(得分:-4)

这是从数据库重置属性的另一种方法:

user.reload