Bulk remove users

I have imported my old data from phpBB3 which went smooth. But I made a mistake by not first cleaning up the old inactive users and still importing them. I now have around 4000 users with no posts I wish to remove.

What is the best way to bulk remove users?

If you really don’t care about these users, then I would do this

  1. make a backup (better safe than sorry)
  2. ssh into your server and type
cd /var/discourse
./launcher enter app
rails c
User.where(post_count: 0).destroy_all
2 Me gusta

These instructions produce the following error:
[1] pry(main)> User.where(post_count: 0).destroy_all ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column users.post_count does not exist LINE 1: SELECT "users".* FROM "users" WHERE "users"."post_count" = 0 ^ : SELECT "users".* FROM "users" WHERE "users"."post_count" = 0 from /var/www/discourse/vendor/bundle/ruby/2.3.0/gems/rack-mini-profiler-0.10.1/lib/patches/db/pg.rb:90:in `exec'

This is not really documented I think but if it is please point me in the right direction?

1 me gusta

“post count” != “post_count” ??

My bad, the post_count property was moved to another table for optimization reasons.

Here’s the updated query

User.joins(:user_stat).where("user_stats.post_count = 0").destroy_all
6 Me gusta

Thank you, the updated query works!

3 Me gusta

One of my sites uses SSO and we’re looking to remove users that have never posted and haven’t been seen in a year (to avoid killing users who are just quiet). Is this query valid in the rails console?

User.joins(:user_stat).where("user_stats.post_count = 0 AND previous_visit_at <= '2016-05-20'::timestamp").destroy_all
2 Me gusta

It looks good to me.

1 me gusta

Tengo el mismo problema, pero con los usuarios que necesito eliminar antes de realizar la importación final. He estado trabajando en crear una configuración base con todas las opciones, temas, etc., antes de hacer la importación; ahora (después de mucho trabajo) descubro que hice esto en una importación parcial que ya había importado 4000 usuarios.

Quisiera eliminarlos para que nadie reciba accidentalmente correos electrónicos de resúmenes o cualquier otra cosa (cuando olvide cambiar esas opciones).

¿Cómo puedo adaptar esa consulta para que solo quede el usuario administrador?
Hay unos 4000 en la lista de usuarios activos
y unos 30 en la lista de usuarios suspendidos.

Gracias de antemano :slight_smile:

Nota: hoy en día existe una clase específica para destruir Usuarios y registros asociados de forma limpia: UserDestroyer.

Así que en lugar de esto:

Esto es lo que se debe hacer:

destroyer = UserDestroyer.new(Discourse.system_user)
User.joins(:user_stat).where("user_stats.post_count = 0").each { |u| destroyer.destroy(u) }
4 Me gusta