특정 그룹에 없는 모든 사용자 삭제

몇 가지 교훈을 얻은 후, 제 질문에 직접 답을 드립니다.

  1. 네, UserDestroyer를 사용하세요. 그렇지 않으면 데이터베이스에 고아 레코드(orphaned records)가 쌓이게 됩니다.
  2. 원치 않는 사용자를 수집하는 방법에 대해 좀 더 세심하게 접근해야 할 수 있습니다. 저는 이 Data Explorer 쿼리를 사용해 해당 사용자 목록을 가져온 다음, 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

많은 수의 사용자를 삭제하는 방법:

Discourse 앱(./launcher enter app 등)에 진입하여 다음을 실행하세요:

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

이 과정은 빠르지 않습니다. 6,000명의 사용자를 삭제하는 데 2시간이 걸렸습니다.