メールパターンに一致するユーザーをまとめて削除したいと考えています。例えば:
- *.xyz
- *.fun
- など
現在、以下のように試しています:User.find(UserEmail.where("email like '%.fun'").pluck(:user_id)).count。しかし、.where() の後に destroy_all 関数を使用できません。
お手数ですが、ご協力いただけますでしょうか?
ありがとうございます。
メールパターンに一致するユーザーをまとめて削除したいと考えています。例えば:
現在、以下のように試しています:User.find(UserEmail.where("email like '%.fun'").pluck(:user_id)).count。しかし、.where() の後に destroy_all 関数を使用できません。
お手数ですが、ご協力いただけますでしょうか?
ありがとうございます。
私も同じことをしたいのですが、それに加えて、それらのユーザーの投稿やトピックもすべて削除したいです。
User.joins(:user_emails)
.where('lower(user_emails.email) LIKE ?', '%domain.com')
特に、パーセント記号(%)はワイルドカードであり、任意の文字が 0 個以上現れることを表します。したがって、%domain.com は domain.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 が代替案として検討できるかもしれません。
こんにちは、@xrav3nz さん!この返信は最高ですね!![]()
まさに私が求めていたものです。今すぐ試してみます。もちろん、ご提案いただいた通り、基本的な count() で確認してから実行します。
一点だけ質問ですが、false ではなく delete_post: true ではないでしょうか?
私のユースケースは非常にシンプルです。@gerhard さんのおかげで古い phpBB をインポートすることができ、それは完璧に機能しました。しかし、その古いフォーラムは偽アカウントで完全に汚染されていました。彼らは一切投稿をしていません。すべてのメールアドレスが .fun や .xyz のように見えました。
おっしゃる通りです!私の入力ミスでした!
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.