回調(diào)概述
????????在 Rails 應用正常運作期間,對象可以被創(chuàng)建、更新或刪除。Active Record 為對象的生命周期提供了鉤子,使我們可以控制應用及其數(shù)據(jù)。
????????回調(diào)使我們可以在對象狀態(tài)更改之前或之后觸發(fā)邏輯。
????????回調(diào)是在對象生命周期的某些時刻被調(diào)用的方法。通過回調(diào),我們可以編寫在創(chuàng)建、保存、更新、刪除、驗證或從數(shù)據(jù)庫中加載 Active Record 對象時執(zhí)行的代碼。
????????回調(diào)在使用之前需要注冊。我們可以先把回調(diào)定義為普通方法,然后使用宏式類方法把這些普通方法注冊為回調(diào):

可用的回調(diào)
????????下面按照回調(diào)在 Rails 應用正常運作期間被調(diào)用的順序,列出所有可用的 Active Record 回調(diào)。
創(chuàng)建對象

更新對象

刪除對象

after_initialize?和?after_find?回調(diào)
? ??????當 Active Record 對象被實例化時,不管是通過直接使用?new?方法還是從數(shù)據(jù)庫加載記錄,都會調(diào)用?after_initialize?回調(diào)。使用這個回調(diào)可以避免直接覆蓋 Active Record 的?initialize?方法。
????????當 Active Record 從數(shù)據(jù)庫中加載記錄時,會調(diào)用?after_find?回調(diào)。如果同時定義了?after_initialize?和?after_find?回調(diào),會先調(diào)用?after_find?回調(diào)。
????????after_initialize?和?after_find?回調(diào)沒有對應的?before_*?回調(diào),這兩個回調(diào)的注冊方式和其他 Active Record 回調(diào)一樣。


調(diào)用回調(diào)
????????下面這些方法會觸發(fā)回調(diào):

????????下面這些查找方法會觸發(fā)?after_find?回調(diào):

????????每次初始化類的新對象時都會觸發(fā)?after_initialize?回調(diào)。
? ??????和驗證一樣,我們可以跳過回調(diào)。使用下面這些方法可以跳過回調(diào):慎重地使用這些方法,因為有些回調(diào)包含了重要的業(yè)務規(guī)則和應用邏輯,在不了解潛在影響的情況下就跳過回調(diào),可能導致無效數(shù)據(jù)。
