2017-01-24 25 views
1

特定の条件に一致するアプリケーションのすべてのユーザーに関連するすべての投稿を削除したいと思います。特に私は、ユーザーが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 

または別のものを使用する予定ですか?

答えて

1

:delete_allフラグを明示的に指定する必要があるのは、:nullifyフラグとの関連付けを定義するときだけです。

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

:delete_allが含まれます。

もう1つ重要な点は、delete_allが定義したコールバックを無視することです。コールバックを呼び出す場合は、destroy_allを使用する必要があります。

destroy_allは、dependentフラグを気にしません。

+0

ここにはどのようなコールバックが関係していますか?私が使用する唯一のコールバックはコントローラです。 destroyアクションのpostsコントローラには、before_action:correct_userコールバックがあります。しかし、私のコードはバックグラウンドジョブの一部であり、非ユーザが関与しています。 delete_allはまだまだ良い選択ですか? – Asarluhi

+1

あなたのActiveRecordモデルは 'before_destroy'のようなコールバックを持っているかもしれません。 –

関連する問題