特定の条件に一致するアプリケーションのすべてのユーザーに関連するすべての投稿を削除したいと思います。特に私は、ユーザーが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
または別のものを使用する予定ですか?
ここにはどのようなコールバックが関係していますか?私が使用する唯一のコールバックはコントローラです。 destroyアクションのpostsコントローラには、before_action:correct_userコールバックがあります。しかし、私のコードはバックグラウンドジョブの一部であり、非ユーザが関与しています。 delete_allはまだまだ良い選択ですか? – Asarluhi
あなたのActiveRecordモデルは 'before_destroy'のようなコールバックを持っているかもしれません。 –