1
1

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 5 years have passed since last update.

[Rails]transaction do時のafter_commitでsaved_change_to_attribute?などの扱い

Posted at

常識なのかわかりませんが、ハマったので備忘録程度に

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

みたいな感じにするのが適切だったんじゃないかと(未検証)

1
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?