Je souhaite supprimer en masse les utilisateurs correspondant à un motif d’email tel que :
J’ai essayé ceci jusqu’à présent : User.find(UserEmail.where("email like '%.fun'").pluck(:user_id)).count. Mais je ne peux pas utiliser la fonction destroy_all après un .where() …
Pourriez-vous m’aider ?
Merci beaucoup.
Je voudrais faire de même, en plus de supprimer tous les messages/sujets de ces utilisateurs.
User.joins(:user_emails)
.where('lower(user_emails.email) LIKE ?', '%domain.com')
En particulier, le signe pourcentage (%) est un caractère générique qui représente zéro ou plusieurs caractères quelconques. Ainsi, %domain.com signifie des adresses e-mail se terminant par domain.com.
Plutôt que User#destroy, il est préférable d’utiliser UserDestroyer :
UserDestroyer.new(Discourse.system_user)
.destroy(user, delete_posts: true)
Cela permettra à l’utilisateur système de supprimer l’utilisateur et tous ses messages.
Pour résumer :
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
Sachez que cette action est irréversible. Vous voudrez peut-être vérifier les utilisateurs sélectionnés par la requête avant de les supprimer réellement. De plus, je ne suis pas certain des implications en termes de performance si vous supprimez un grand nombre d’utilisateurs et/ou s’ils ont un grand nombre de messages.
Par ailleurs, je ne sais pas si Anonymizing Users in Discourse constitue une alternative pour vous ?
Salut @xrav3nz ! Cette réponse est géniale ! 
C’est exactement ce dont j’ai besoin, je vais l’essayer tout de suite, bien sûr en confirmant d’abord le nombre avec un simple count() comme tu l’as suggéré.
Une remarque : ne devrait-ce pas être delete_post: true au lieu de false ?
Mon cas d’usage est très simple : j’ai importé un ancien phpBB (merci à @gerhard) et cela a parfaitement fonctionné, mais cet ancien forum était totalement pollué par des faux comptes… Ils n’ont publié aucun message. Toutes les adresses e-mail ressemblaient à .fun ou .xyz.
Oui, tu as raison ! Une faute de frappe de ma part !