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

Isa*_*aac 14 ruby-on-rails callback associations destroy

我有一个Ahas_many 的对象B(简单关联):

has_many :book_accounts, {
    dependent: :destroy
}
Run Code Online (Sandbox Code Playgroud)

我正在进行before_destroy回调.我想检查并确保在销毁之前没有C(属于哪个B)和D's(属于哪个C)A.我检查了日志,并且B在回调之前所有的都被删除导致回调崩溃.

这是Rails应该如何工作?除了删除dependent: destroy和手动销毁回调中B的s之外,我能做些after_destroy什么吗?或者这是首选解决方案?

小智 22

这是一个非常愚蠢的铁轨问题和令人沮丧的问题.在Rails中定义关系时,该:dependent选项实际上会创建一个回调.如果before_destroy在关系之后定义回调,则在关系被销毁之前不会调用回调.

解决方案是before_destroy在声明关联之前订购回调.

你的代码将是这样的

Class A < ActiveRecord::Base
  before_destroy :check

  has_many :book_accounts, dependent: :destroy
End
Run Code Online (Sandbox Code Playgroud)


Jon*_*nas 10

必须添加prepend: true回调声明:

before_destroy :do_something_before_children_removed, prepend: true
Run Code Online (Sandbox Code Playgroud)

  • 文档链接:https://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#module-ActiveRecord::Callbacks-label-Ordering+callbacks (2认同)