1. ホーム
  2. ruby-on-rails

[解決済み] Railsで属性の元の値を取得する方法

2023-01-30 23:13:43

質問

ActiveRecordの属性の元の値(=データベースから読み込まれた値)を取得する方法はありますか?

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

before_save object
  do_something_with object.original_name
end

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

どのように解決するのか?

rails 5.1以前

追加 _was を追加すると、前の値が表示されます。

rails 5.1+の場合

以下のLucas Andradeの回答からコピーしたものです。 : https://stackoverflow.com/a/50973808/9359123


追加 _was は rails 5.1 で非推奨になりました。 _before_last_save

みたいな感じ。

before_save object
  do_something_with object.name_before_last_save
end

データベースで最後に保存する前の名前の値を返します (保存と作成で動作します)





の違いは _was_before_last_save というように、ドキュメントによると

_was ソース docs から

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

最後の保存の前に ソース docs から

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