破坏和删除之间的区别
有什么区别
@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等等。
当你调用对象上的delete
或delete_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被触发或者您希望获得更好的性能,您可以使用“删除”。 否则(和大部分时间),你会想要使用“销毁”。