为什么我的 ActiveRecord (v6) `before_destroy` 回调没有触发?

问题描述 投票:0回答:1

我有一个模型,其中

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
ruby-on-rails rails-activerecord
1个回答
0
投票

您想使用

destroy
ActiveRecord中的一些方法不会触发回调,
delete
就是其中之一:

仅使用记录主键上的 SQL DELETE 语句删除该行,并且 不执行回调
...
要强制执行对象的

before_destroy
after_destroy
回调或任何
:dependent
关联选项,使用
destroy

https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-delete

© www.soinside.com 2019 - 2024. All rights reserved.