2015-07-10 83 views
9

刪除之前我有一個對象A是HAS_MANY B的(簡單關聯):Ruby on Rails的 - 協會被 「before_destroy」

has_many :book_accounts, { 
    dependent: :destroy 
} 

我工作的一個before_destroy回調。我想檢查並確保在破壞A之前沒有C(屬於B)和D(屬於C)。我檢查了日誌,並且在回調導致回調崩潰之前,所有B都被刪除了。

這是Rails應該如何工作?除了刪除dependent: destroy並在after_destroy回調中手動銷燬B之外,我還能做些什麼嗎?或者說,這是一個解決方案?

+0

看到這裏的討論:https://github.com/rails/rails/issues/3458 –

回答

16

這是一個非常愚蠢的問題的軌道&也令人沮喪。在Rails中定義關係時,:dependent選項實際上會創建一個回調。如果在關係之後定義了一個before_destroy回調,那麼在關係被銷燬之前不會調用回調。

解決方法是在關聯聲明之前訂購before_destroy回調。

您的代碼將是這樣的

Class A < ActiveRecord::Base 
    before_destroy :check 

    has_many :book_accounts, dependent: :destroy 
End 
+0

我其實也發現了這個(https://github.com/rails/rails/issues/3458),並且在你回答時正在回答這個問題。謝謝! – Isaac

4

必須添加prepend: true回調聲明:

before_destroy :do_something_before_children_removed, prepend: true