Rails Active Record 上的依赖销毁与依赖删除之间的区别

Difference between dependent destroy vs dependent delete on Rails Active Record

Active Record 的 dependent: :destroy 是否也删除数据库记录?

例如依赖::删除

:destroy 选项从数据库中加载每个相关记录并调用该对象的 destroy 方法。 :delete 选项直接从数据库中删除每条记录,而不调用销毁或任何回调。


可以在此处找到每种关联类型的文档:

belongs_to: https://guides.rubyonrails.org/association_basics.html#options-for-belongs-to-dependent

has_one: https://guides.rubyonrails.org/association_basics.html#options-for-has-one-dependent

has_many: https://guides.rubyonrails.org/association_basics.html#dependent

是的,两者都会删除数据库记录,但执行方式不同。

您可以在此处查看此问题的答案:

Rails :dependent => :destroy VS :dependent => :delete_all

基本上 dependent: :delete 将直接在数据库上执行对依赖记录的删除,而不执行任何 activerecod 验证或回调。

虽然 dependent: :destroy 将实例化所有相关记录并为每个对象执行 :destroy(执行验证和回调)。

删除有什么作用?

Delete Documentation 在基本术语中,使用 delete 使用与 id 参数匹配的主键删除数据库中的行,使用 SQL DELETE 语句和 returns 删除的行数。您可以通过传递 id 数组一次删除多行。但是调用delete时,就是这样。幕后没有其他事情发生。

销毁有什么作用?

Destroy Documentation 如您所见,使用 destroy 还会从 table 中删除给定的 id(或多个 id)。但是,首先实例化一个对象,因此在“删除”对象之前会触发所有回调和过滤器。由于在“删除”对象之前执行了额外的回调和验证,此方法的效率低于 ActiveRecord#delete,但它允许清理方法和其他操作 运行。本质上,这会找到给定的 id,根据属性创建一个新对象,然后对其调用销毁(执行任何依赖项和回调)。