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,根据属性创建一个新对象,然后对其调用销毁(执行任何依赖项和回调)。
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,根据属性创建一个新对象,然后对其调用销毁(执行任何依赖项和回调)。