常識なのかわかりませんが、ハマったので備忘録程度に
after_commitが動かない
after_commit :hoge, if: saved_change_to_attribute?
みたいなことをしていたんですが、動かないんです。
after_saveだと動くのに
該当処理
after_commit :hoge, if: saved_change_to_status?
enum role: {
admin: 0
general: 1
}
enum status: {
active: 1000
suspend: 2000
}
def hoge
なにかしらの処理
end
みたいなモデルが存在して、hogeが走るきっかけとして
def fuga
User.transaction do
user.admin!
user.active!
end
end
というのがありました。
user.active!
でstatusを更新しているので、当然saved_change_to_status?
はtrueでコミット後にhogeが動くと思っていたら、動かないんです。
previous_changes
fuga実行時になにが起きてるのか、previous_changesを吐かせて見てみました。
すると、user.admin!
時のroleカラムの変更しかないんですよね。
{"role"=>["general", "admin"], "updated_at"=>[Mon, 03 Sep 2018 17:26:50 JST +09:00, Mon, 03 Sep 2018 17:26:51 JST +09:00]}
みたいな感じで。
どうやら先に走った分しか渡してくれない模様
結論
急いでたので一旦順番を入れ替えることでしのぎました
def fuga
User.transaction do
user.active!
user.admin!
end
end
こんな感じで
しかし、本来なら
def fuga
User.transaction do
user.admin
user.active
user.save!
end
end
みたいな感じにするのが適切だったんじゃないかと(未検証)