# 特定のグループに属さないすべてのユーザーを削除

**URL:** https://meta.discourse.org/t/delete-all-users-not-in-a-specific-group/198804
**Category:** Support
**Created:** [2021 年 8 月 1 日午前 9:55 UTC](https://meta.discourse.org/t/delete-all-users-not-in-a-specific-group/198804 "2021-08-01T09:55:09Z")
**Posts on this page:** 2
**Page:** 1

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [2021 年 8 月 1 日午前 9:55 UTC](https://meta.discourse.org/t/delete-all-users-not-in-a-specific-group/198804/1 "2021-08-01T09:55:09Z")

</div>

DiscourseからDiscourseへの移行/統合の一環として、特定のグループに属さないすべてのユーザーを削除しようとしています。

rails コンソールで以下を試しました：  
`User.joins(:group_users).where.not(group_users:{group_id:135}).destroy_all`

残念ながら、これではすべてのユーザーが削除されてしまい、大変な目に遭いました！

UI と少し厄介な rails コードを使って行う方法は見つけたのですが、もっと簡単な方法はありませんか？おそらく構文を間違えているのでしょう。

GUI を通じて削除対象のユーザー（約 6000 人）を「メーガグループ」に追加した後、試したコードは以下の通りです：

```plaintext
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` の違いは何でしょうか？後者を使うべきでしょうか？

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [2021 年 8 月 20 日午後 10:02 UTC](https://meta.discourse.org/t/delete-all-users-not-in-a-specific-group/198804/2 "2021-08-20T22:02:04Z")

</div>

自分自身の質問に回答します。いくつかの教訓を学びました。

1. はい、`UserDestroyer` を使用してください。そうしないと、孤立したレコードがデータベースに散乱してしまいます。
2. 不要なユーザーを収集する方法には工夫が必要かもしれません。私は以下の [Data Explorer](https://meta.discourse.org/t/32566?silent=true) クエリを使用してユーザーのリストを取得し、それを `unwanted` というグループに一括追加しました。

```plaintext
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` など）、以下を実行してください。

```plaintext
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

```

高速ではありません。6000 人のユーザーの場合、2 時間かかりました。
