我有一个模型,其中X
可以包含许多Y
,Y
可以包含许多Z
。这是一个树--一个子节点不能属于多个父节点。
put语句告诉我,当我调用y.delete
时,before_destroy
回调函数没有被触发,但是delete
方法被触发了。
显然我可以把钩子放在delete
方法中,但我很好奇为什么destroy回调不起作用。
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
字符串
1条答案
按热度按时间9rbhqvlz1#
您想使用
destroy
,ActiveRecord 中的某些方法不会触发回调,delete
就是其中之一:只需在记录的主键上使用一条SQL语句删除该行,并且不执行任何回调。
...
要强制执行对象的
before_destroy
和after_destroy
回调或任何:dependent
关联选项,使用destroy
。