Vorrei eliminare in blocco gli utenti che corrispondono a un pattern di email come:
*.xyz
*.fun
ecc.
Finora ho provato questo: User.find(UserEmail.where("email like '%.fun'").pluck(:user_id)).count. Ma non riesco a utilizzare la funzione destroy_all dopo un .where()…
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:
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.
Ciao @xrav3nz! Questa risposta è fantastica!
È esattamente quello che mi serve, lo proverò subito, confermando prima l’importo con un semplice count() come hai suggerito.
Una nota: non dovrebbe essere delete_post: true invece di false?
Il mio caso d’uso è molto semplice: ho importato un vecchio phpBB (grazie a @gerhard) e ha funzionato perfettamente, ma questo vecchio forum era completamente inquinato da account falsi… Non hanno pubblicato nessun messaggio. Tutti gli indirizzi email sembrano .fun o .xyz.