Eliminar todos los usuarios excepto los administradores o unos pocos usuarios seleccionados, lo que sea más fácil

¿Existe un script rápido que me permita eliminar masivamente a todos los usuarios excepto a los administradores o a unos pocos usuarios seleccionados identificados por sus ID/correos electrónicos? Cualquiera de las dos opciones es válida.

Querré hacer esto desde la consola de Rails.

Gracias

 User.where(admin: false).destroy_all

Creo que eso debería funcionar. Puedes ejecutar lo anterior sin el destroy_all para ver qué usuarios se seleccionan.

2 Me gusta

Gracias, ¿es destroy_all lo mismo que UserDestroyer o se recomienda uno sobre el otro? Vi que UserDestroyer se mencionaba varias veces en otras publicaciones. Gracias.

Ahora falla con esto después de eliminar alrededor de 200, pero ahora está atascado:

ActiveRecord::RecordInvalid: Validación fallida: El correo electrónico principal no puede estar en blanco
desde /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3/lib/active_record/validations.rb:80:in `raise_validation_error'

He buscado y encontrado una publicación sobre la verificación de correos electrónicos bloqueados en Admin > Logs > Screened Emails y no se muestra nada, pero no estoy seguro de qué hacer a continuación. Gracias.

Deberías usar UserDestroyer. Borrará otros datos asociados con el usuario.

No sé por qué obtuviste ese error.

Podrías restaurar tu copia de seguridad a antes de que comenzaras la eliminación y probar el destructor en su lugar.

1 me gusta

He restaurado y vuelto a intentarlo con el UserDestroyer, pero sigo recibiendo ese error. ¿Hay alguna forma de rastrear qué lo está causando?

Puedes usar un script de Rails o el Explorador de Datos para comprobar las direcciones de correo electrónico y ver si alguna está en blanco… Aunque sería raro. Ningún campo de correo electrónico está en blanco por defecto, ni siquiera para cuentas generadas automáticamente como discobot o system (que son administradores por defecto).

¿Se importaron tus usuarios? Pero aun así, estoy bastante seguro de que los métodos de creación de cuentas no permiten campos de correo electrónico en blanco.

Hemos utilizado OAuth con una aplicación personalizada. Lo hice ayer pero no devolvió ningún usuario:

User.joins(:user_emails).where(user_emails.email = \"\") y eso devolvió nil, así que no creo que haya ninguno vacío.

Sin embargo, solo deben ser uno o dos usuarios porque la mayoría funciona, pero ahora se está atascando instantáneamente en el mismo.

Mi script de eliminación es:

User.where(admin: false).find_each do |user| UserDestroyer.new(Discourse.system_user).destroy(user, delete_posts: true) end

¿Hay alguna forma de mostrar qué usuario está procesando mientras se repite el bucle?

Puedes mostrar los nombres de usuario y sus correos electrónicos correspondientes:

User.where(admin: false).find_each do |user|
  puts "#{user.username}: #{user.email}"
  UserDestroyer.new(Discourse.system_user).destroy(user, delete_posts: true)
end
3 Me gusta

Gracias, esto es genial, lo ejecutaré ahora y espero que me diga quién está teniendo problemas.

1 me gusta

Sí, esto funcionó, me mostró con qué estaba luchando y era un carácter ilegal en el correo electrónico de alguna manera, así que lo actualicé y funcionó. Gracias.

3 Me gusta

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