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?