メールパターンに一致するユーザーを一括削除

User.joins(:user_emails)
  .where('lower(user_emails.email) LIKE ?', '%domain.com')

特に、パーセント記号(%)はワイルドカードであり、任意の文字が 0 個以上現れることを表します。したがって、%domain.comdomain.com で終わるメールアドレスを意味します。

User#destroy を使うのではなく、UserDestroyer を使用するのが最適です。

UserDestroyer.new(Discourse.system_user)
  .destroy(user, delete_posts: true)

これにより、システムユーザーが指定されたユーザーとそのすべての投稿を削除します。

まとめると以下のようになります。

User.joins(:user_emails)
  .where('lower(user_emails.email) LIKE ?', '%domain.com')
  .find_each do |user|
    UserDestroyer.new(Discourse.system_user).destroy(user, delete_posts: true)
  end

これは取り返しがつかない操作であることに注意してください。実際に削除する前に、クエリで選択されたユーザーを確認することをお勧めします。また、大量のユーザーや多数の投稿を持つユーザーを削除する場合のパフォーマンスへの影響については確信が持てません。

別の話題になりますが、Anonymizing Users in Discourse が代替案として検討できるかもしれません。

「いいね!」 7