after_commit 是一種 Actice RecordCallback

當我們透過 Active Record 與資料庫互動時,有許多的時機點可以觸發 Active Record Callback,對資料做檢查或是儲存後的其他操作.

使用情境

舉一個之前專案的例子,在網站上有許多的組織以及其中的成員,當我們新增成員加入組織時,我們需要寄信通知組織的管理員(有成員加入組織等等…)

我們可以在 model.rb 中利用 after_save 去執行寄信,當成員成功加入組織後(user.save),執行寄信程式,儘管看起來沒問題,寄信程式的確會在 user.save 成功後執行。

但從資料庫的角度來看,如果新增成員後還有其他操作,一旦失敗,資料庫便會將整個 transaction 退回,即 ACID 中的 Atomicity (全部成功、或全部失敗)

而這時背景執行的寄信程式,便無法正確執行

因此,我們可以改用 after_commit callback ,確保資料庫 transation 成功 commit 後,才呼叫寄信程式寄信。

reference

https://blog1.westagilelabs.com/when-to-use-after-commit-in-rails-f5e53a22bb9

https://guides.rubyonrails.org/v6.1/active_record_callbacks.html