Discourse에서 Discourse로의 마이그레이션/병합 작업의 일환으로, 특정 그룹에 속하지 않는 모든 사용자를 삭제하려고 합니다.
다음과 같이 Rails 콘솔에서 시도해 보았습니다: User.joins(:group_users).where.not(group_users:{group_id:135}).destroy_all
불행히도 이 명령으로 모든 사용자가 삭제되어 꽤 골치가 아팠습니다!
UI와 다소 추한 Rails 코드를 조합해서 처리하는 번거로운 방법을 찾았지만, 더 쉬운 방법이 있을까요? 아마도 구문 문법을 잘못 사용한 것 같습니다.
GUI를 통해 삭제 대상 사용자(약 6,000명)로 구성된 대형 그룹을 만드는 데 고생을 한 후, 다음을 시도해 보았습니다:
rails c
target_group = Group.find_by_name("nz-not")
users = User.joins(:group_users).where(group_users:{group_id: target_group.id})
users.each do |u|
u.destroy
end
exit
또한, destroy와 UserDestroyer를 사용하는 것의 차이점은 무엇인가요? 후자를 사용해야 하나요?
네, UserDestroyer를 사용하세요. 그렇지 않으면 데이터베이스에 고아 레코드(orphaned records)가 쌓이게 됩니다.
원치 않는 사용자를 수집하는 방법에 대해 좀 더 세심하게 접근해야 할 수 있습니다. 저는 이 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