如何删除符合条件的集合

How to delete a collection matching a condition

我想删除与我的应用程序中符合确定条件的每个用户关联的所有帖子。特别是,只有当用户有超过 20 个帖子时,我才想删除所有超过 30 天的帖子。 一开始我写了下面的代码:

users = User.all
users.each do |user|
    if user.posts.any? && user.posts.count > 20
        user.posts.delete_all('created_at < ?', 30.days.ago)
    end 
end

但是,查看 API documentation,集合的方法 delete_all 并不意味着记录实际上已从数据库中删除,而这恰恰取决于指定的参数,:nullify:delete_all

因此,考虑到集合的方法 delete_all 需要上述参数之一,以下代码是否正确:

users = User.all
users.each do |user|
    if user.posts.any? && user.posts.count > 20
        user.posts.where('created_at < ?', 30.days.ago).delete_all(:delete_all)
    end 
end

或者我应该使用不同的东西吗?

只有在定义与 :nullify 标志的关联时,才需要明确指定 :delete_all 标志。

class Post < ApplicationRecord
  belongs_to :user, dependent: :nullify
end

否则:delete_all是隐含的。

另一个重要的一点是 delete_all 忽略了您可能已经定义的回调。如果你想调用回调,你需要使用 destroy_all.

destroy_all 不关心 dependent 标志。