Eliminar masivamente usuarios que coincidan con un patrón de correo electrónico

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()

¿Podrías ayudarme, por favor?
Muchas gracias.

2 Me gusta

Me gustaría hacer lo mismo, además de eliminar todos los publicaciones/temas de esos usuarios también.

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:

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

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.

Por otro lado, no sé si Anonymizing Users in Discourse podría ser una alternativa para ti.

7 Me gusta

¡Hola @xrav3nz! ¡Esta respuesta es increíble! :open_mouth:
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.

2 Me gusta

¡Sí, tienes razón! ¡Fue un error de tipeo de mi parte!

2 Me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.