Excluir todos os usuários que não estão em um grupo específico

Respondendo à minha própria pergunta, tendo aprendido algumas lições.

  1. Sim, use UserDestroyer ou seu banco de dados ficará cheio de registros órfãos.
  2. Você pode precisar ser esperto sobre como reunir seus usuários indesejados. Usei esta consulta do Data Explorer para obter uma lista deles, que então adicionei em massa a um grupo chamado unwanted.
WITH included_users AS (
SELECT
gu.user_id
FROM group_users gu
JOIN groups g
ON g.id = gu.group_id
WHERE g.name = :included_group
),

excluded_users AS (
SELECT
gu.user_id
FROM group_users gu
JOIN groups g
ON g.id = gu.group_id
WHERE g.name = :excluded_group
)

SELECT 
     u.id AS user_id, u.username
FROM users as u
WHERE u.id in (SELECT user_id FROM included_users)
AND u.id NOT IN (SELECT user_id FROM excluded_users)
GROUP by u.id

Como destruir muitos usuários:

Entre no aplicativo Discourse (./launcher enter app, etc) e execute os seguintes comandos:

rails c
 target_group = Group.find_by_name("unwanted")
 users = User.joins(:group_users).where(group_users:{group_id: target_group.id})
 users.each do |u|
  u.admin = false
  u.moderator = false
  u.save
  UserDestroyer.new(Discourse.system_user).destroy(u, delete_posts: true)
 end
Exit

Não é rápido. Para 6000 usuários, levou 2 horas.