Me gustaría eliminar en masa los usuarios que coincidan con un patrón de correo electrónico como:
*.xyz
*.fun
etc.
Hasta ahora he intentado esto: User.find(UserEmail.where("email like '%.fun'").pluck(:user_id)).count. Pero no puedo usar la función destroy_all después de un .where()…
User.joins(:user_emails)
.where('lower(user_emails.email) LIKE ?', '%domain.com')
En particular, el signo de porcentaje (%) es un comodín que representa cero o más caracteres cualesquiera. Por lo tanto, %domain.com significa correos electrónicos que terminan con domain.com.
En lugar de User#destroy, lo mejor es utilizar UserDestroyer:
Esto hará que el usuario del sistema elimine al usuario y todas sus publicaciones.
Para resumirlo:
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
Ten en cuenta que esto es irreversible. Es posible que quieras verificar los usuarios seleccionados por la consulta antes de eliminarlos realmente. Además, no estoy seguro de las implicaciones en el rendimiento si estás eliminando un gran número de usuarios y/o si tienen un gran número de publicaciones.
¡Hola @xrav3nz! ¡Esta respuesta es increíble!
Esto es exactamente lo que necesito, lo probaré ahora mismo, aunque antes confirmaré la cantidad con un count() básico, por supuesto, como sugeriste.
Una observación: ¿no debería ser delete_post: true en lugar de false?
Mi caso de uso es muy sencillo: importé un phpBB antiguo (gracias a @gerhard) y funcionó perfectamente, pero ese antiguo foro estaba totalmente contaminado por cuentas falsas… No publicaron ningún mensaje. Todas las direcciones de correo electrónico parecen ser .fun o .xyz.