Elimina in blocco gli utenti che corrispondono a un modello di email

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

In particolare, il segno percentuale (%) è un carattere jolly che rappresenta zero o più caratteri qualsiasi. Quindi %domain.com indica email che terminano con domain.com.

Invece di User#destroy, è meglio utilizzare UserDestroyer:

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

Questo farà sì che l’utente di sistema cancelli l’utente e tutti i suoi post.

Per riassumere:

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

Fai attenzione: questa operazione è irreversibile. Potresti voler verificare gli utenti selezionati dalla query prima di cancellarli effettivamente. Inoltre, non sono sicuro delle implicazioni sulle prestazioni se stai cancellando un gran numero di utenti e/o se hanno un gran numero di post.

A proposito, non sono sicuro che Anonymizing Users in Discourse possa essere un’alternativa per te?