Destroy和Delete之间的区别

use*_*458 190 ruby-on-rails delete-row destroy

有什么区别

@model.destroy@model.delete

例如:

Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
Run Code Online (Sandbox Code Playgroud)

如果我使用其中一个真的重要吗?

小智 269

基本上destroy在模型上运行任何回调而delete不是.

Rails API:

  • ActiveRecord::Persistence.delete

    删除数据库中的记录并冻结此实例以反映不应进行任何更改(因为它们无法保留).返回冻结的实例.

    只需在记录的主键上使用SQL DELETE语句删除该行,并且不执行任何回调.

    要强制执行对象的before_destroy和after_destroy回调或任何:依赖关联选项,请使用#destroy.

  • ActiveRecord::Persistence.destroy

    删除数据库中的记录并冻结此实例以反映不应进行任何更改(因为它们无法保留).

    有一系列与destroy相关的回调.如果before_destroy回调返回false,则取消操作并且destroy返回false.有关更多详细信息,请参阅ActiveRecord :: Callbacks.

  • @BKSpurgeon他的意思是ActiveRecord :: Callbacks:http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html.一个这样的回调是`model#before_destroy`,它可以用来在某些条件下暂停最终的`destroy()`调用. (3认同)

Tai*_*aiz 92

delete 将仅从db中删除当前对象记录,但不从db中删除其关联的子记录.

destroy 将从db中删除当前对象记录以及从db中删除其关联的子记录.

它们的使用非常重要:

如果您的多个父对象共享公共子对象,则调用destroy特定父对象将删除在其他多个父对象之间共享的子对象.

  • 很棒的答案.谢谢.我想补充一点,我理解的术语是孩子们"被杀"了.残忍的杀婴. (5认同)

小智 11

当您调用destroydestroy_allActiveRecord对象ActiveRecord上启动"销毁"过程时,它会分析您要删除的类,它确定它应该为依赖项执行的操作,运行验证等.

当您调用deletedelete_all在对象上时,ActiveRecord仅尝试DELETE FROM tablename WHERE conditions对db 运行查询,不执行其他ActiveRecord级别的任务.


小智 7

例子:

Class User
  has_many :contents, dependent: :destroy
end

user = User.last
user.delete -> only user
user.destroy -> delete user , and contents of user
Run Code Online (Sandbox Code Playgroud)

delete将从数据库中删除当前记录(无回调)

destroy将删除当前记录和关联记录(有回调)

delete_all与和相同destroy_all


jam*_*esc 5

是的,这两种方法之间存在重大差异\n如果您希望快速删除记录而不调用模型回调,请使用delete_all

\n\n

如果您关心模型回调,请使用 destroy_all

\n\n

来自官方文档

\n\n

http://apidock.com/rails/ActiveRecord/Base/destroy_all/class

\n\n
\n

destroy_all(条件= nil)公共

\n\n

通过实例化每条记录并调用其 destroy 方法来销毁符合条件的记录。每个对象\xe2\x80\x99s 回调都会被执行\n(包括:依赖关联选项和\n before_destroy/after_destroy 观察者方法)。返回被销毁的对象的集合;每个都将被冻结,以反映\n 不应进行任何更改(因为它们可以\xe2\x80\x99t 被持久化)。

\n\n

注意:当您\xe2\x80\x99 一次删除许多记录时,实例化、回调执行和删除每条记录可能会非常耗时。它为每条记录至少生成一个 SQL DELETE 查询(或者可能更多,以强制执行回调)。如果您想要快速删除多行,\n而不关心它们的关联或回调,请改用delete_all\n。

\n
\n