如何删除与条件匹配的集合

时间:2017-01-24 16:19:40

标签: ruby-on-rails rails-activerecord sql-delete

我想删除与确定条件匹配的应用程序的每个用户关联的所有帖子。特别是,如果用户的帖子超过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或{ {1}}

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

delete_all

还是我希望使用不同的东西?

1 个答案:

答案 0 :(得分:1)

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

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

否则隐含:delete_all

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

destroy_all不关心dependent标志。