【问题标题】:How to Destroy multiple objects simultaneously in Rails 3如何在 Rails 3 中同时销毁多个对象
【发布时间】:2013-01-04 05:42:50
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

【解决方案2】:
Model.delete([1,2,5,6]) 

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

只需传递 ids 数组

【讨论】:

  • 删除和销毁不是一回事。
  • 如何传递 id 数组...当我像上面那样尝试时遇到路由错误...
【解决方案3】:

如果性能对您很重要和/或如果您处理大型数据集,您应该更喜欢 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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      这是我的解决方法。

      之前

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

      之后

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-29
        • 2012-02-06
        • 1970-01-01
        相关资源
        最近更新 更多