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

时间:2013-01-21 07:24:48

标签: ruby-on-rails ruby-on-rails-3

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

我试过发送一个由','分隔的id到rails destroy方法,但它只销毁单个对象。 是否可以删除rails 3中的多个对象。

5 个答案:

答案 0 :(得分:93)

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

答案 1 :(得分:6)

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

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

只需传递ids数组

答案 2 :(得分:0)

如果性能对您很重要和/或如果您处理大型数据集,则应优先选择delete_all而不是destroy_all。

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

由于@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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

这是我的解决方法。

之前

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

之后

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