Ruby on Rails - 在“before_destroy”之前删除关联

时间:2015-07-10 14:33:08

标签: ruby-on-rails callback associations destroy

我有一个对象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之外,我还能做些什么吗?或者这是最佳解决方案?

2 个答案:

答案 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