破坏和删除之间的区别

有什么区别

@model.destroy@model.delete

例如:

 Model.find_by(col: "foo").destroy_all //and Model.find_by(col: "foo").delete_all 

如果我使用这个或那个,真的很重要吗?

基本上destroy在模型上运行任何callback,而delete没有。

从Rails API :

  • ActiveRecord::Persistance.delete

    删除数据库中的logging并冻结此实例以反映不应该进行更改(因为它们不能被保留)。 返回冻结的实例。

    该行只是通过logging的主键上的SQL DELETE语句来删除,并且不执行任何callback。

    要强制执行对象的before_destroy和after_destroycallback或任何依赖关联选项,请使用#destroy。

  • ActiveRecord::Persistance.destroy

    删除数据库中的logging并冻结此实例以反映不应该进行更改(因为它们不能被保留)。

    有一系列与摧毁有关的callback。 如果before_destroycallback返回false,则操作被取消,并且销毁返回false。 有关更多详细信息,请参阅ActiveRecord :: Callbacks。

delete将只从数据库删除当前的对象logging,但从数据库中删除其关联的子logging。

destroy将从数据库中删除当前的对象logging,也从数据库中删除其关联的子logging。

他们的使用非常重要:

如果多个父对象共享公共子对象,则调用特定父对象上的destroy将删除与其他多个父对象共享的子对象。

当你在一个ActiveRecord对象上调用destroy或者destroy_all的时候, ActiveRecord的销毁过程就会启动,它会分析你正在删除的类,它决定了它应该为依赖项做些什么,通过validation等等。

当你调用对象上的deletedelete_all时, ActiveRecord只会尝试运行DELETE FROM tablename WHERE conditions查询数据库,不执行其他ActiveRecord级别的任务。

是的,这两种方法之间有一个主要的区别使用delete_all如果你想快速删除logging没有模型callback被调用

如果你关心你的模型callback,那么使用destroy_all

从官方文档

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

destroy_all(conditions = nil)public

通过实例化每条logging并调用其销毁方法销毁匹配条件的logging。 执行每个对象的callback(包括:依赖关联选项和before_destroy / after_destroy观察器方法)。 返回被销毁的对象的集合; 每个都将被冻结,以反映不应该做出改变(因为它们不能被坚持)。

注意:实例化,callback执行和每个logging的删除在一次删除多条logging时会非常耗时。 它为每个logging至less生成一个SQL DELETE查询(或者可能更多,以执行您的callback)。 如果您想快速删除多行,而不关心它们的关联或callback,请改用delete_all。

基本上“删除”直接发送查询到数据库删除logging。 在这种情况下,Rails不知道它正在删除的logging中的属性是什么,也不知道是否有任何callback(如before_destroy )。

“destroy”方法使用传递的id,使用“find”方法从数据库中提取模型,然后调用destroy方法。 这意味着callback被触发。

如果您不希望callback被触发或者您希望获得更好的性能,您可以使用“删除”。 否则(和大部分时间),你会想要使用“销毁”。