# 批量删除匹配特定邮箱模式的用户

**URL:** https://meta.discourse.org/t/bulk-delete-users-that-match-an-email-pattern/147012
**Category:** Support
**Created:** [2020年四月6日 16:01 UTC](https://meta.discourse.org/t/bulk-delete-users-that-match-an-email-pattern/147012 "2020-04-06T16:01:47Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![fallais](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/fallais/32/175780_2.png) [@fallais](https://meta.discourse.org/u/fallais)
#### Post date: [2020年四月6日 16:01 UTC](https://meta.discourse.org/t/bulk-delete-users-that-match-an-email-pattern/147012/1 "2020-04-06T16:01:47Z")

</div>

我想批量删除匹配特定邮箱模式的用户，例如：

- \*.xyz
- \*.fun
- 等等…

目前我尝试了以下代码：`User.find(UserEmail.where("email like '%.fun'").pluck(:user_id)).count`。但我无法在 `.where()` 之后使用 `destroy_all` 函数…

能否请您帮忙？  
非常感谢。

---

<div class="post-metadata">

### Author: ![christian\_01](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/christian_01/32/162392_2.png) [@christian\_01](https://meta.discourse.org/u/christian_01)
#### Post date: [2020年四月8日 12:35 UTC](https://meta.discourse.org/t/bulk-delete-users-that-match-an-email-pattern/147012/2 "2020-04-08T12:35:36Z")

</div>

我也想这样做，同时删除这些用户的所有帖子/主题。

---

<div class="post-metadata">

### Author: ![xrav3nz](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/xrav3nz/32/76894_2.png) [@xrav3nz](https://meta.discourse.org/u/xrav3nz)
#### Post date: [2020年四月9日 01:22 UTC](https://meta.discourse.org/t/bulk-delete-users-that-match-an-email-pattern/147012/3 "2020-04-09T01:22:44Z")

</div>

> [@fallais](#):
>
> 匹配特定邮箱模式的用户

```ruby
User.joins(:user_emails)
  .where('lower(user_emails.email) LIKE ?', '%domain.com')

```

具体来说，百分号（`%`）是一个通配符，代表零个或多个任意字符。因此，`%domain.com` 表示以 `domain.com` 结尾的邮箱地址。

> [@fallais](#):
>
> 删除用户

与其使用 `User#destroy`，最好使用 [`UserDestroyer`](https://github.com/discourse/discourse/blob/befaf39aca3af22756a988134245bf1a88a7481d/app/services/user_destroyer.rb)：

```ruby
UserDestroyer.new(Discourse.system_user)
  .destroy(user, delete_posts: true)

```

这将使系统用户删除该用户及其所有帖子。

> [@fallais](#):
>
> 批量删除匹配特定邮箱模式的用户

总结如下：

```ruby
User.joins(:user_emails)
  .where('lower(user_emails.email) LIKE ?', '%domain.com')
  .find_each do |user|
    UserDestroyer.new(Discourse.system_user).destroy(user, delete_posts: true)
  end

```

请注意，此操作是不可逆的。在真正删除之前，您可能需要验证查询所选的用户。此外，如果您要删除大量用户和/或这些用户拥有大量帖子，我不确定性能影响会如何。

另外，不确定 [Anonymizing Users in Discourse](https://meta.discourse.org/t/anonymizing-users-in-discourse/86929) 是否可作为您的替代方案？

---

<div class="post-metadata">

### Author: ![fallais](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/fallais/32/175780_2.png) [@fallais](https://meta.discourse.org/u/fallais)
#### Post date: [2020年四月9日 07:56 UTC](https://meta.discourse.org/t/bulk-delete-users-that-match-an-email-pattern/147012/4 "2020-04-09T07:56:11Z")

</div>

嗨 @xrav3nz！这个回复太棒了！😮  
这正是我需要的，我现在就试试。当然，我会先按照你的建议，用一个基础的 `count()` 来确认数量。

有个问题想提一下，这里是不是应该是 `delete_post: true` 而不是 `false`？

我的使用场景很简单：我导入了一些旧的 phpBB 数据（感谢 @gerhard），运行得非常顺利。但那个旧论坛充斥着大量虚假账号……他们从未发布过任何帖子，所有邮箱地址看起来都是 **.fun** 或 **.xyz** 结尾的。

---

<div class="post-metadata">

### Author: ![xrav3nz](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/xrav3nz/32/76894_2.png) [@xrav3nz](https://meta.discourse.org/u/xrav3nz)
#### Post date: [2020年四月9日 16:57 UTC](https://meta.discourse.org/t/bulk-delete-users-that-match-an-email-pattern/147012/5 "2020-04-09T16:57:46Z")

</div>

> [@fallais](#):
>
> 提个建议，这里是不是应该是 `delete_post: true` 而不是 `false`？

你说得对！是我打错了！

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [2020年五月9日 16:57 UTC](https://meta.discourse.org/t/bulk-delete-users-that-match-an-email-pattern/147012/6 "2020-05-09T16:57:57Z")

</div>

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
