1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ActiveRecord の `after_save` と `after_commit on: :save`

Last updated at Posted at 2021-09-06

比較する。

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

Ref

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?