我想删除与确定条件匹配的应用程序的每个用户关联的所有帖子。特别是,如果用户的帖子超过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
还是我希望使用不同的东西?
答案 0 :(得分:1)
只有在定义与:delete_all
标志的关联时,才需要明确指定:nullify
标志。
class Post < ApplicationRecord
belongs_to :user, dependent: :nullify
end
否则隐含:delete_all
。
另一个重点是delete_all
忽略了您可能已定义的回调。如果您想要调用回调,则需要使用destroy_all
。
destroy_all
不关心dependent
标志。