我有一个对象A
has_many B
的(简单关联):
has_many :book_accounts, {
dependent: :destroy
}
我正在进行before_destroy
回调。我想在销毁{{1}之前检查并确保没有C
的{belongs_to B
)和D
'(belongs_to C
) }}。我检查了日志,并且在回调之前所有A
都被删除,导致回调崩溃。
这是Rails应该如何工作的?除了移除B
并手动销毁dependent: destroy
回调中的B
之外,我还能做些什么吗?或者这是最佳解决方案?
答案 0 :(得分:19)
这是一个非常愚蠢的rails& amp;也很沮丧。在Rails中定义关系时,:dependent
选项实际上会创建一个回调。如果在关系之后定义before_destroy
回调,则在关系被销毁之前不会调用回调。
解决方案是在声明关联之前订购before_destroy
回调。
您的代码将是这样的
Class A < ActiveRecord::Base
before_destroy :check
has_many :book_accounts, dependent: :destroy
End
答案 1 :(得分:8)
必须将prepend: true
添加到回调声明:
before_destroy :do_something_before_children_removed, prepend: true