Rails - 删除符合条件的所有记录

Noa*_* B. 38 sql activerecord ruby-on-rails

你怎么用Rails方式写的?我有一个模特 - 经理.我想从管理器中删除满足manager_level为5的条件的所有记录.

谢谢.

Mur*_*foX 71

我认为最好使用destroy而不是delete

因为破坏会从数据库从数据库以及其相关的儿童记录删除当前对象记录(/sf/answers/1593035951/)

delete也会跳过回调,但destroy不会.

Manager.where(:manager_level => 5).destroy_all
Run Code Online (Sandbox Code Playgroud)

  • 绝对有效,但请记住:"通过实例化每条记录并调用其destroy方法来销毁记录匹配条件." (http://apidock.com/rails/ActiveRecord/Relation/destroy_all)对于大型结果集,这可能非常慢. (7认同)
  • @MurifoX - 你能解释为什么你认为破坏比删除更好吗?不一定不同意,但这将有助于使您的答案更加完整. (5认同)
  • 是的,我正在考虑保持模型的一致性和实质性。 (2认同)

And*_*are 34

试试这个:

Manager.delete_all(manager_level: 5)
Run Code Online (Sandbox Code Playgroud)

  • 这应该是接受的答案,因为其他查询在DELETING之前尝试SELECT - 导致大型数据集上的性能问题. (4认同)
  • 将条件传递给“delete_all/destroy_all”已[在 Rails 5.1 中删除](https://github.com/rails/rails/pull/27503/files#diff-eb992cfe9de67b368e9d3736ab1388d8L506)。 (2认同)

小智 17

这应该工作:

Manager.where(:manager_level => 5).delete_all
Run Code Online (Sandbox Code Playgroud)

注意:这不会删除相关记录.


Nav*_*asu 7

在 Rails 5.1. 之后,我们不能向delete_all/destroy_all方法传递条件

Manager.where(:manager_level => 5).delete_all
Run Code Online (Sandbox Code Playgroud)

这将运行多个查询以删除每条记录

但是在 Rails 6 中,我们可以使用 delete_by 来删除使用条件,

Manager.delete_by(manager_level: 5)
Run Code Online (Sandbox Code Playgroud)

这将运行单个删除查询

delete from managers where manager_level = 5