如何删除符合条件的集合
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
标志。
我想删除与我的应用程序中符合确定条件的每个用户关联的所有帖子。特别是,只有当用户有超过 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
标志。