Massenlöschung von Benutzern, die einem E-Mail-Muster entsprechen

Ich möchte Benutzer, die einem bestimmten E-Mail-Muster entsprechen, massenhaft löschen, wie z. B.:

  • *.xyz
  • *.fun
  • usw.

Bisher habe ich Folgendes versucht: User.find(UserEmail.where("email like '%.fun'").pluck(:user_id)).count. Allerdings kann ich die Funktion destroy_all nicht nach einem .where() verwenden…

Könntest du mir bitte helfen?
Vielen Dank.

Ich möchte dasselbe tun, zusätzlich dazu, alle Beiträge/Themen dieser Benutzer ebenfalls zu löschen.

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

Insbesondere ist das Prozentzeichen (%) ein Platzhalter, der null oder mehr beliebige Zeichen repräsentiert. %domain.com bedeutet also E-Mails, die mit domain.com enden.

Statt User#destroy ist es am besten, den UserDestroyer zu verwenden:

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

Dadurch wird der Benutzer und alle seine Beiträge vom Systembenutzer gelöscht.

Zusammengefasst:

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

Sei dir bewusst, dass dies irreversibel ist. Möglicherweise möchtest du die vom Abfrage ausgewählten Benutzer überprüfen, bevor du sie tatsächlich löschst. Außerdem bin ich mir der Leistungsimplikationen nicht sicher, wenn du eine große Anzahl von Benutzern löschst und/oder wenn diese eine große Anzahl von Beiträgen haben.

Übrigens: Ist Anonymizing Users in Discourse eine Alternative für dich?

Hallo @xrav3nz! Diese Antwort ist großartig! :open_mouth:
Das ist genau das, was ich brauche. Ich werde es sofort ausprobieren, natürlich wie von dir vorgeschlagen, zuerst mit einer einfachen count()-Abfrage, um die Menge zu bestätigen.

Eine Anmerkung: Sollte es nicht delete_post: true statt false sein?

Mein Anwendungsfall ist sehr einfach: Ich habe ein altes phpBB importiert (danke an @gerhard), und es hat perfekt funktioniert. Dieses alte Forum war jedoch komplett von Fake-Accounts verseucht. Sie haben keine Nachrichten verfasst. Alle E-Mail-Adressen sehen aus wie .fun oder .xyz.

Ja, du hast recht! Ein Tippfehler meinerseits!