在處理after_create_commit這個callback時,發現會有重複執行的問題,最初觀察到的現象是會執行兩次
經過多次修改嘗試後,確定問題是出在callback內更新,單純在裡面放logger丟訊息並不會重複
google後才發現這問題從Rails 4.0就有了(汗
後續也不斷有issue被提出來,不過都沒有去解決
要重現這個問題很簡單,只要弄一個像這樣的Model,然後對它create就能看到無限迴圈
class Test < ApplicationRecord after_create_commit :update_time def update_time self.update(updated_at: Time.now) end end
目前我的解法是透過after_commit_everywhere這個套件,將程式碼直接掛在當下執行時的transaction上,由於不牽涉到rails本身的transaction運作,所以不會遇到重複的雷
還好最近終於有人去修這個問題了(ae028984),不過因為是剛弄上去的,要包進release可能還要些時間
留言