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

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

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

与其使用 User#destroy,最好使用 UserDestroyer

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

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

总结如下:

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 是否可作为您的替代方案?

7 个赞