56

我有一个 Rails 应用程序试图一次删除多个对象。

我尝试过将一组由“,”分隔的 id 发送到 rails destroy 方法,但它只破坏单个对象。是否可以删除rails 3中的多个对象。

4

5 回答 5

123

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
于 2013-01-21T07:41:41.343 回答
8
Model.delete([1,2,5,6]) 

或者

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

只需传递 ids 数组

于 2013-01-21T07:27:36.970 回答
0

如果性能对您很重要和/或如果您处理大型数据集,您应该更喜欢 delete_all 而不是 destroy_all。

Destroy_all 将一次执行一个 DELETE 查询。所以它可能非常慢。有关 delete_all 和 destroy_all 之间差异的更多详细信息,请参见此页面

由于@M Kumar 的答案将被新铁路版本弃用。

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
于 2017-03-01T10:24:48.893 回答
0

您还可以删除一系列 Id。假设您有 1500 条记录,并且您想从 751 条删除到最后一条:

a = Model.where(id: [751..1500])
a.destroy_all
于 2018-07-06T13:30:18.680 回答
0

我遇到了完全相同的问题,但是这里的解决方案在 rails 5.1.6 中对我不起作用。

也许您以错误的方式传递参数params[:ids]

以下是我修复它的方法。

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

ids = params[:ids].split(",")
Model.where(:id => ids).destroy_all
于 2018-08-02T14:18:20.723 回答