2015-07-10 82 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