给定以下条件:
@users = User.where(:state => 1)
which 15 for: @users.length
在rails控制台中,有没有一种方法可以删除所有这些记录,也许可以通过执行@users.delete
之类的操作?
@users = User.where(:state => 1)
最简单的方法是使用destroy_all
或delete_all
:
@users.destroy_all
# OR
@users.delete_all
仅此而已
您的模型类有一个delete
方法(和destroy
方法(,可以使用单个ID或一个ID数组来删除(或销毁(。传递一个数组将只发出单个DELETE
语句,在这种情况下是最好的选择。
User.delete @users.map { |u| u.id }
# or
User.destroy @users.map { |u| u.id }
请注意,当您在ActiveRecord模型上调用destroy
时,它会在删除记录之前创建该记录的实例(因此会运行回调等(。在这种情况下,由于您已经有了完全实例化的对象,如果您真的想调用destroy
(而不是delete
(,那么使用J--L的答案中的方法并自己迭代它们可能会更具性能。
yep:
@users.each{ |u| u.destroy }
@users.destroy_all
是
DELETE FROM USERS
,因此它将删除表中的所有记录!!不仅仅是数组中对象的记录!所以我认为最好的方法是User.delete @users.map { |u| u.id }
销毁所有是最简单的方法。语法如下:
User.destroy_all(id: [2, 3])
以防有人需要。在Rails6中,如果您已经知道要删除什么,并且希望以高效的方式对许多记录进行删除,那么您可以使用以下两种方法之一:
Model.delete_by(id: array_of_id, other_condition: value)
基于delete_all
,文档:
delete_by
:https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-delete_bydelete_all
:https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-delete_all
或:
Model.destroy_by(id: array_of_id, other_condition: value)
基于destroy_all
,文档:
destroy_by
:https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-destroy_bydestroy_all
:https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-destroy_all
不同之处在于delete_by
不会运行回调、验证,也不会删除依赖关联。而destroy_by
将完成所有这些(但以较慢的方式(。因此,这实际上取决于您希望为应用程序实现什么。
这两种方法都应该优先于.where.something,因为它们将创建一个SQL查询,而不是多个SQL查询。