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方法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)
结果是一个查询来销毁所有关联的记录
| 归档时间: |
|
| 查看次数: |
94524 次 |
| 最近记录: |