簡體   English   中英

rails 回調中 after_create、after_save 和 after_commit 的區別

[英]Difference between after_create, after_save and after_commit in rails callbacks

Rails 中after_createafter_saveafter_commit的區別在於:

  • after_save在創建和更新對象時調用
  • after_commit在創建、更新和銷毀時被調用。
  • after_create僅在創建對象時調用

這是它們之間唯一的區別,還是還有其他主要區別?

你幾乎猜對了。 但是after_commitafter_createafter_save之間有一個主要區別,即

after_create的情況下,這將始終在調用 save(或 create)返回之前。

Rails 將每次保存都包裝在一個事務中,並且在該事務中運行 before/after create 回調(其結果是,如果在 after_create 中引發異常,則保存將回滾)。 使用after_commit ,您的代碼直到最外層事務提交后才會運行。 這可能是創建的事務軌道或由您創建的軌道(例如,如果您想在單個事務中進行多項更改)。 最初發布在這里

這也意味着,如果after_commit引發異常,則事務將不會回滾。

使用回調順序

after_create -

在 Model.save 之后對尚未保存的新對象調用(不存在記錄)

after_save -

在 Model.save 之后調用(無論是創建還是更新保存)

after_commit -

在數據庫事務完成后調用。

此外,即使僅觸及記錄, after_commit 也會執行。 這可能不是您想要的。 after_save 將不會在觸摸后運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM