Alle Benutzer löschen, die nicht in einer bestimmten Gruppe sind

Ich beantworte meine eigene Frage und habe dabei ein paar Lehren gezogen.

  1. Ja, verwenden Sie UserDestroyer, sonst wird Ihre Datenbank mit verwaisten Datensätzen übersät sein.
  2. Sie müssen möglicherweise geschickt vorgehen, um Ihre unerwünschten Benutzer zu sammeln. Ich habe diese Data-Explorer-Abfrage verwendet, um eine Liste zu erhalten, die ich dann in einer Gruppe namens unwanted zusammengefasst habe.
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

So löschen Sie viele Benutzer:

Starten Sie die Discourse-App (./launcher enter app usw.) und führen Sie Folgendes aus:

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

Es ist nicht schnell. Für 6000 Benutzer hat es 2 Stunden gedauert.