删除除管理员或少数选定用户外的所有用户,以较容易的方式进行

是否有一个快速脚本可以让我批量删除除管理员或由其 ID/电子邮件标识的少数用户之外的所有用户?哪个选项更容易都可以。

我想从 rails 控制台执行此操作。

谢谢。

 User.where(admin: false).destroy_all

我认为这应该可以。您可以不带 destroy_all 执行此操作,以查看选择了哪些用户。

2 个赞

谢谢,destroy_allUserDestroyer 是一样的吗?还是推荐其中一个?在其他帖子中看到过几次提到 UserDestroyer。谢谢。

删除大约 200 条记录后,它现在失败了,但现在卡住了:

ActiveRecord::RecordInvalid: Validation failed: Primary email can't be blank
from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3/lib/active_record/validations.rb:80:in `raise_validation_error'

我搜索了一下,发现有一篇帖子提到了在“管理员 > 日志 > 筛选的电子邮件”中检查被阻止的电子邮件,但没有任何显示,但不知道接下来该怎么做。谢谢。

您应该使用 UserDestroyer。它将删除与用户关联的其他数据。

不知道您为什么会收到那个错误。

您可以将备份恢复到开始删除操作之前,然后尝试使用 destroyer。

1 个赞

我已经恢复并再次尝试使用 UserDestroyer,但仍然收到该错误。有什么方法可以追踪导致此问题的原因吗?

您可以使用 rails 脚本或 Data Explorer 来检查电子邮件地址,看看是否有空白的……尽管这很奇怪。默认情况下,没有电子邮件字段是空白的,即使是像 discobot 或 system(默认情况下都是管理员)这样的自动生成帐户。

您的用户是导入的吗?但即便如此,我敢肯定帐户创建方法不允许空白电子邮件字段。

我们使用了带有自定义应用程序的 OAuth。我昨天这样做了,但没有返回任何用户:

User.joins(:user_emails).where(user_emails.email = \"\") 这返回了 nil,所以我不认为有任何是空的。

不过应该只有一两个用户,因为大多数用户都可以正常工作,但现在它在同一个用户上立即卡住了。

我的删除脚本是:

User.where(admin: false).find_each do |user| UserDestroyer.new(Discourse.system_user).destroy(user, delete_posts: true) end

有没有办法在循环时回显它正在处理哪个用户?

您可以输出用户名及其对应的电子邮件:

User.where(admin: false).find_each do |user|
  puts "#{user.username}: #{user.email}"
  UserDestroyer.new(Discourse.system_user).destroy(user, delete_posts: true)
end
3 个赞

谢谢,这太棒了,我现在就运行它,希望能告诉我它在与谁挣扎。

1 个赞

是的,这奏效了,它向我展示了它在哪个地方遇到了问题,原来是电子邮件中有一个非法字符,所以我更新了它,它就奏效了。谢谢。

3 个赞

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