2018年2月3日 星期六

rails after_create and after_commit

after_create 有時候觸發的時候 database 還沒寫入,所以要確定 database 寫入以後才執行的話應該放到 after_commit

例如

```ruby
ActiveRecord::Base.transaction do
  order = build_order
  order.save!
  do_something_1
  do_something_2
end
```

上述do_something 1 跟 2 可能花很久時間,但這時 after_create 已經觸發了,這樣就會有可能發生 error,尤其是 after_create 執行的動作需要在 order 已經建立為前提的話。


另外還有一個 activerecord lifecycle 的坑就是當 server restart 時可能會中斷 lifecycle,所以其實這種東西應該要盡可能放到 sidekiq 執行,確保不會漏掉。

沒有留言:

張貼留言