2013-09-06 18 views
10

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

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

user.revert 
user.name # "Fred" 

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

好ましくはRails 3ソリューションです。

+0

あなたがこれを必要とする理由? – CodeGroover

+0

私はあなたに 'nil 'を割り当てることができると思います。 'user = nil'は復帰と同じですが(必ずしも古い値である必要はありません) – Bala

+0

私は、古い値がオブジェクトに保持されていることを認識しませんでした。アクセス方法に関するドキュメントを教えてください。 –

答えて

7

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

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

Idではなく、 'c.changes.each {| k、vs |オブジェクトに属性を設定するためのハッシュ表記の代わりに、c.send( "#{k} ="、最初は、)}}を使用します。 – MrYoshiji

-4

これからの属性をリセットするための別の方法でありますデータベース:

+1

OPは彼がこれについて既に知っていると言っていて、DBにヒットしたくはない。 – mgwidmann

9
user.reload 

this answerレール4.2で述べたようには、でrestore_attributes方法を導入します:

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"