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

メールパターンに一致するユーザーをまとめて削除したいと考えています。例えば:

  • *.xyz
  • *.fun
  • など

現在、以下のように試しています:User.find(UserEmail.where("email like '%.fun'").pluck(:user_id)).count。しかし、.where() の後に destroy_all 関数を使用できません。

お手数ですが、ご協力いただけますでしょうか?
ありがとうございます。

「いいね!」 2

私も同じことをしたいのですが、それに加えて、それらのユーザーの投稿やトピックもすべて削除したいです。

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

こんにちは、@xrav3nz さん!この返信は最高ですね!:open_mouth:
まさに私が求めていたものです。今すぐ試してみます。もちろん、ご提案いただいた通り、基本的な count() で確認してから実行します。

一点だけ質問ですが、false ではなく delete_post: true ではないでしょうか?

私のユースケースは非常にシンプルです。@gerhard さんのおかげで古い phpBB をインポートすることができ、それは完璧に機能しました。しかし、その古いフォーラムは偽アカウントで完全に汚染されていました。彼らは一切投稿をしていません。すべてのメールアドレスが .fun.xyz のように見えました。

「いいね!」 2

おっしゃる通りです!私の入力ミスでした!

「いいね!」 2

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.