鉴于以下内容:
@users = User.where(:state => 1)
which 15 for: @users.length
在rails控制台中,有没有办法可以删除所有这些记录,可能是通过像@users.delete
那样做的?
答案 0 :(得分:14)
@users = User.where(:state => 1)
最简单的方法是使用destroy_all
或delete_all
:
@users.destroy_all
# OR
@users.delete_all
这就是
答案 1 :(得分:4)
您的模型类有a delete
method(和destroy
method),可以删除(或销毁)一个ID或一个ID数组。传递数组只会发出单 DELETE
语句,在这种情况下是最佳选择。
User.delete @users.map { |u| u.id }
# or
User.destroy @users.map { |u| u.id }
请注意,当您在ActiveRecord模型上调用destroy
时,它会在删除之前创建记录实例(因此会运行回调等)。在这种情况下,由于您已经拥有完全实例化的对象,如果您确实想要调用destroy
(而不是delete
),那么使用J-_-L's answer中的方法可能会更高效。自己迭代。
答案 2 :(得分:2)
@users.destroy_all
是最简单的方式
答案 3 :(得分:1)
是的:
@users.each{ |u| u.destroy }
答案 4 :(得分:1)
摧毁一切是最简单的方法。这是语法:
User.destroy_all(id: [2, 3])
答案 5 :(得分:0)
destroy_all或delete_all将执行如下查询:DELETE FROM USERS
,因此它将删除表中的所有记录!!不仅是数组中对象的记录!
所以我认为最好的方法是User.delete @users.map { |u| u.id }
答案 6 :(得分:0)
万一有人需要这个。在Rails 6中,如果您已经知道要删除的内容,并且想要对许多记录进行有效的删除,则可以使用以下任一方法:
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_by delete_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_by destroy_all
:
https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-destroy_all 区别在于delete_by
不会运行回调,验证,也不会删除依赖的关联。尽管destroy_by
将完成所有操作(但速度较慢)。因此,这实际上取决于您想要为应用程序实现什么。
这两种方法均应优先于.where.something,因为它们将创建单个SQL查询,而不是多个SQL查询。