首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >销毁和删除的区别

销毁和删除的区别
EN

Stack Overflow用户
提问于 2014-03-31 08:58:54
回答 7查看 134.6K关注 0票数 253

两者有什么区别?

@model.destroy@model.delete

例如:

代码语言:javascript
运行
复制
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all

我用这个还是那个真的有关系吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-03-31 09:03:05

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

来自Rails API

  • ActiveRecord::Persistence.delete 删除数据库中的记录并冻结此实例,以反映不应进行任何更改(因为它们不能持久保存)。返回冻结的实例。 只需在记录的主键上使用SQL语句删除该行,就不会执行回调。 若要强制执行对象的before_destroy和after_destroy回调或任何:依赖关联选项,请使用#析构。
  • ActiveRecord::Persistence.destroy 删除数据库中的记录并冻结此实例,以反映不应进行任何更改(因为它们不能持久保存)。 有一系列与破坏相关的回调。如果before_destroy回调返回false,则此操作将被取消,而destroy返回false。有关详细信息,请参阅ActiveRecord::回调。
票数 345
EN

Stack Overflow用户

发布于 2014-03-31 09:09:21

delete只会从db中删除当前对象记录,而不会从db删除与其关联的子记录。

destroy将从db中删除当前对象记录,并从db中删除与其关联的子记录。

他们的使用真的很重要:

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

票数 130
EN

Stack Overflow用户

发布于 2014-03-31 09:02:51

当您对一个destroy对象或destroy_all对象调用ActiveRecorddestroy_all时,会启动ActiveRecord的“销毁”过程,它将分析要删除的类,确定它对依赖项应该做什么,通过验证运行等等。

当对对象调用deletedelete_all时,ActiveRecord只是尝试对db运行DELETE FROM tablename WHERE conditions查询,而不执行其他ActiveRecord-level任务。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22757450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档