我有一个模型,其中
X
可以包含许多 Y
,而 Y
可以包含许多 Z
。它是一棵树——一个孩子不能属于多个父母。
put 语句显示,当我调用
before_destroy
时,y.delete
回调不会触发,但 delete
方法会触发。
我显然可以将钩子放在
delete
方法中,但我很好奇为什么销毁回调不起作用。我在这个应用程序中有 before_create
回调,并且它们工作正常。
class Y < ApplicationRecord
before_destroy :do_before_destroy, prepend: true
belongs_to :x
has_many :zs, dependent: :destroy
def delete
puts "in delete"
super
end
private
def do_before_destroy
puts "do_before_destroy"
self.zes.destroy_all
end
end
destroy
。 ActiveRecord中的一些方法不会触发回调,delete
就是其中之一:
仅使用记录主键上的 SQL DELETE 语句删除该行,并且 不执行回调。
...
要强制执行对象的和before_destroy
回调或任何after_destroy
关联选项,使用:dependent
。destroy
https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-delete