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不是.
ActiveRecord::Persistence.delete
删除数据库中的记录并冻结此实例以反映不应进行任何更改(因为它们无法保留).返回冻结的实例.
只需在记录的主键上使用SQL DELETE语句删除该行,并且不执行任何回调.
要强制执行对象的before_destroy和after_destroy回调或任何:依赖关联选项,请使用#destroy.
ActiveRecord::Persistence.destroy
删除数据库中的记录并冻结此实例以反映不应进行任何更改(因为它们无法保留).
有一系列与destroy相关的回调.如果before_destroy回调返回false,则取消操作并且destroy返回false.有关更多详细信息,请参阅ActiveRecord :: Callbacks.
Tai*_*aiz 92
delete 将仅从db中删除当前对象记录,但不从db中删除其关联的子记录.
destroy 将从db中删除当前对象记录以及从db中删除其关联的子记录.
它们的使用非常重要:
如果您的多个父对象共享公共子对象,则调用destroy特定父对象将删除在其他多个父对象之间共享的子对象.
小智 11
当您调用destroy或destroy_all在ActiveRecord对象ActiveRecord上启动"销毁"过程时,它会分析您要删除的类,它确定它应该为依赖项执行的操作,运行验证等.
当您调用delete或delete_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
是的,这两种方法之间存在重大差异\n如果您希望快速删除记录而不调用模型回调,请使用delete_all
\n\n如果您关心模型回调,请使用 destroy_all
\n\n来自官方文档
\n\nhttp://apidock.com/rails/ActiveRecord/Base/destroy_all/class
\n\n\n\ndestroy_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
| 归档时间: |
|
| 查看次数: |
89579 次 |
| 最近记录: |