比較する。
x ---after_save ---> y
xとyは同一のtransaction内に入る。「xとyが同時に行われないとデータ不整合が生じまずい」際に使用する。
レコードへの差分は、#saved_changes_to_attributeにより取得できる。
なお、after_save内にタスクのエンキューを含めるのは悪手である。
- y内でエンキューより後で処理が転んだ時に、作成されたレコードはロールバックされるがジョブは残ることになる。
- ジョブの中に別トランザクションを張って同一のテーブルを見る処理があったとする。エンキューされたジョブの中でafter_saveのコミット前にDBを参照すると、x内での処理が反映されていない。
(このような場合は、after_commitを用いる)。
x --- after_commit ---> y
xはtransactionがはられ,yはその中に入らない。つまり、「yが失敗してxだけが実行されても問題ない」。(Error Reporting Serviceを見てyの失敗通知に気づいてyだけ実行するので問題ない)つまり、「yの成否にかかわらず、xを実行したい」
レコードへの差分は以下で取得できる。(on: :destroyの場合は、普通にselfのattributeを見れば良い)
- 差分があったか
attr_previously_changed?
- 差分
attr_previously_change
- 差分前
attr_previously_was