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

[解決済み] ActiveRecordを使用して、after_update時にレコードの古い値を取得する方法はありますか?

2023-04-29 01:32:49

質問

簡単な例で設定します。 私は1つのテーブル( Totals の合計を保持するテーブルがあります。 amount カラムの合計を保持するテーブル ( Things ).

がある場合 thing.amount が更新されたとき、単純に古い値と新しい値の差分を total.sum .

今、私は self.amount の間に before_update を追加し self.amount の間に after_update . これは、アップデートが成功することに過度の信頼を置いています。

制約です。 単純に全取引の合計を再計算したいわけではないのですが。

質問です。 簡単に言うと、私は after_update コールバック中に元の値にアクセスしたいです。 あなたはこれを行うためにどのような方法を考え出したのですか?

更新しました。 Luke Franclのアイデアに賛成です。 の間に after_update のコールバックの間、あなたはまだ self.attr_was の値にもアクセスできます。 また、私は after_update 実装にすることにしました。なぜなら、この種のロジックをモデル内に保持したいからです。 こうすることで、今後どのようにトランザクションを更新することになっても、トランザクションの合計を正しく更新していることを確認できます。実装の提案をしてくれた皆さん、ありがとうございました。

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

トランザクションについてみんなが言っていることと同じです。

とはいえ...

Rails 2.1時点でのActiveRecordは、オブジェクトの属性値を記録しています。ですから、もしあなたが属性 total という属性があれば total_changed? メソッドと total_was メソッドで、古い値を返します。

もうこれを追跡するためにモデルに何かを追加する必要はありません。

更新してください。 以下は ActiveModel::Dirty のドキュメントです。