17

Activerecord オブジェクトへのローカルの変更を元に戻す/元に戻す方法はありますか? 例えば:

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

user.revert
user.name # "Fred"

できることはわかっていuser.reloadますが、古い値がオブジェクトの状態に保存されているため、これを行うためにデータベースにアクセスする必要はありません。

できればRails 3ソリューション。

4

3 に答える 3

26

この回答で述べたように、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"
于 2016-03-23T11:09:31.120 に答える
23

誰かがここにたどり着いた場合に備えて、restore_attributes は Rails 4.2 の時点でそれを行う方法です:

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

于 2015-02-11T06:25:16.940 に答える
9

「変更」をループしてリセットするだけです。これを行う方法があるかもしれませんが、私は見ませんでした。

> 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!")}
于 2013-09-06T17:59:59.773 に答える