Ruby Rails - 关联在 "before_destroy" 之前被删除
Ruby on Rails - Association gets deleted before "before_destroy"
我有一个对象 A
has_many B
的(简单关联):
has_many :book_accounts, {
dependent: :destroy
}
我正在处理 before_destroy
回调。我想检查并确保没有 C
(belongs_to B
)和 D
(belongs_to C
) 在销毁 A
之前。我检查了日志,所有 B
都在回调之前被删除,导致回调崩溃。
这就是 Rails 的工作方式吗?除了删除 dependent: destroy
并在 after_destroy
回调中手动销毁 B
之外,我还能做些什么吗?或者这是首选解决方案?
这是一个非常愚蠢的问题 rails,也很令人沮丧。当您在 Rails 中定义关系时,:dependent
选项实际上会创建一个回调。如果您在关系之后定义一个 before_destroy
回调,那么在关系被销毁之前不会调用您的回调。
解决方案是在声明关联之前订购 before_destroy
回调。
你的代码将是这样的
Class A < ActiveRecord::Base
before_destroy :check
has_many :book_accounts, dependent: :destroy
End
必须将 prepend: true
添加到回调声明中:
before_destroy :do_something_before_children_removed, prepend: true
我有一个对象 A
has_many B
的(简单关联):
has_many :book_accounts, {
dependent: :destroy
}
我正在处理 before_destroy
回调。我想检查并确保没有 C
(belongs_to B
)和 D
(belongs_to C
) 在销毁 A
之前。我检查了日志,所有 B
都在回调之前被删除,导致回调崩溃。
这就是 Rails 的工作方式吗?除了删除 dependent: destroy
并在 after_destroy
回调中手动销毁 B
之外,我还能做些什么吗?或者这是首选解决方案?
这是一个非常愚蠢的问题 rails,也很令人沮丧。当您在 Rails 中定义关系时,:dependent
选项实际上会创建一个回调。如果您在关系之后定义一个 before_destroy
回调,那么在关系被销毁之前不会调用您的回调。
解决方案是在声明关联之前订购 before_destroy
回调。
你的代码将是这样的
Class A < ActiveRecord::Base
before_destroy :check
has_many :book_accounts, dependent: :destroy
End
必须将 prepend: true
添加到回调声明中:
before_destroy :do_something_before_children_removed, prepend: true