如何在Rails 3中同时销毁多个对象

61

我有一个Rails应用程序,它正在尝试一次性删除多个对象。

我尝试了将ID集合以逗号分隔的方式发送到Rails destroy方法,但它只能销毁单个对象。 在Rails 3中是否可以删除多个对象。


2
给出的答案是正确的,但是为了了解 delete_all 和 destroy_all 的区别,请阅读以下内容:https://dev59.com/IWw15IYBdhLWcg3wT59c - Anand Soni
5个回答

129

destroy_all 方法通过为每个实例记录调用 destroy方法,销毁符合条件的记录。因此,对象的回调会被执行。

Model.destroy_all(:status => "inactive")
Model.where(:id => [1,2,3,4,5]).destroy_all
Model.where(:id => 1..5).destroy_all

更新

User.where(:id => params[:ids]).destroy_all

/users?ids[]=1&ids[]=2&ids[]=3

如何传递 ID 数组,我尝试了像 http://localhost:3000/users/id=[1,2,3,4] 这样的方式... Rails 能接受这种路由吗? - Cyber
你能展示一下 routes.rb 文件吗? - Eugene Rourke

8
Model.delete([1,2,5,6]) 

或者
Model.delete_all(["col_name in (?)", [1,2,5,6]])

只需传递id数组


16
删除并不等同于销毁。 - Sergio Tulentsev
如何传递 ID 数组...当我尝试像上面那样进行时,我遇到了路由错误... - Cyber

2

我曾经遇到过完全相同的问题,但是这里的解决方案在Rails 5.1.6中对我无效。

可能是你传递params[:ids]参数的方式不正确。

这是我的解决方法。

之前的代码

Model.where(:id => params[:ids]).destroy_all

之后

ids = params[:ids].split(",")
Model.where(:id => ids).destroy_all

0
如果性能对您很重要,或者您正在处理大型数据集,则应优先选择delete_all而不是destroy_all。
destroy_all将逐个执行DELETE查询。因此速度可能非常慢。有关delete_all和destroy_all之间差异的更多详细信息,请参见此页面
由于@M Kumar的答案将在新版本的Rails中被弃用。
Model.delete_all(["col_name in (?)", [1,2,5,6]])
DEPRECATION WARNING: Passing conditions to delete_all is deprecated and will be removed in Rails 5.1.

这个命令可能会帮助未来的其他人:
Model.where(id: [1,2,5,6]).delete_all

0

您还可以删除一系列的ID。比如您有1500条记录,想要删除从751到最后的记录:

a = Model.where(id: [751..1500])
a.destroy_all

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接