web-dev-qa-db-ja.com

Railsで属性の元の値を取得する方法

activeRecord属性(=データベースからロードされた値)という元の値を取得する方法はありますか?

オブザーバーでこのようなものが欲しい

before_save object
  do_something_with object.original_name
end

タスクは、更新時にオブジェクトをハッシュテーブルから削除します(実際には、テーブル内の別のキーにオブジェクトを移動します)。

95
Leonid Shevtsov

属性に_wasを追加すると、以前の値が得られます。

239
Vincent

ActiveRecordの attributes_before_type_cast メソッドは、型キャストと逆シリアル化が行われる前に属性のハッシュを返します。

8
John Topley

Rails 5.1+

_wasの追加は、Rails 5.1では廃止されました。現在、_before_last_saveを追加する必要があります

何かのようなもの:

before_save object
  do_something_with object.name_before_last_save
end

データベースに最後に保存する前に名前の値を返します(保存および作成に機能します)


ドキュメントによると_was_before_last_saveの違い:

_ wassource docsから

def attribute_was(attr)
  attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end

_ before_last_savesource ドキュメントから

def attribute_before_last_save(attr_name)
  mutations_before_last_save.original_value(attr_name)
end

より良い例を見ることができます here

8
Lucas Andrade

Rails documentation

http://api.rubyonrails.org/classes/ActiveModel/Dirty.html

Model.attribute_wasは前の値を返します:D

4
rderoldan1