delete_all vs destroy_all?

glo*_*gic 182 ruby database activerecord ruby-on-rails

我正在寻找从表中删除记录的最佳方法.例如,我有一个用户,其用户ID跨越许多表.我想删除此用户以及在所有表中具有其ID的每个记录.

u = User.find_by_name('JohnBoy')
u.usage_indexes.destroy_all
u.sources.destroy_all
u.user_stats.destroy_all
u.delete
Run Code Online (Sandbox Code Playgroud)

这工作并从所有表中删除用户的所有引用,但我听说这destroy_all是非常重的过程,所以我尝试了delete_all.它只从用户自己的用户表中删除用户,并将id所有其他表中的用户设为null,但保留其中的记录.有人可以分享执行此类任务的正确流程吗?

我看到在所有相关对象上destroy_all调用该destroy函数,但我只是想确认正确的方法.

San*_*nda 228

你是对的.如果要删除用户和所有关联对象 - > destroy_all 但是,如果您只想删除用户而不抑制所有关联对象 - >delete_all

根据这篇文章:Rails:dependent =>:destroy VS:dependent =>:delete_all

  • destroy/ destroy_all:通过调用destroy方法将相关对象与此对象一起销毁
  • delete/ delete_all:所有关联的对象都会被立即销毁,而不会调用它们:destroy方法

  • 还应该注意1)使用`delete_all`时不调用回调,2)`destroy_all`实例化所有记录并一次销毁一个,所以对于一个非常大的数据集,这可能会非常缓慢. (73认同)

Rya*_*Her 21

delete_all是一个SQL DELETE语句,仅此而已.destroy_all在所有匹配结果上调用destroy():条件(如果有的话),这些结果可能至少为NUM_OF_RESULTS个SQL语句.

如果你必须在大型数据集上做一些极端的事情,例如destroy_all(),我可能不会从应用程序中执行它并小心地手动处理它.如果数据集足够小,你就不会受到太大伤害.


小智 16

为了避免destroy_all实例化所有记录并一次销毁一个记录,您可以直接从模型类中使用它.

所以代替:

u = User.find_by_name('JohnBoy')
u.usage_indexes.destroy_all
Run Code Online (Sandbox Code Playgroud)

你可以做 :

u = User.find_by_name('JohnBoy')
UsageIndex.destroy_all "user_id = #{u.id}"
Run Code Online (Sandbox Code Playgroud)

结果是一个查询来销毁所有关联的记录