Удалить всех пользователей, кроме администраторов или нескольких избранных — как проще

Есть ли быстрый скрипт, который позволит мне массово удалить всех пользователей, кроме администраторов или нескольких выбранных, идентифицируемых по их ID или электронным адресам? Подойдёт любой из этих вариантов, если он проще.

Хочу выполнить это из консоли Rails.

Спасибо

 User.where(admin: false).destroy_all

Думаю, это сработает. Вы можете выполнить команду выше без destroy_all, чтобы увидеть, какие пользователи будут выбраны.

Спасибо. destroy_all — это то же самое, что и UserDestroyer, или один из них рекомендуется использовать? 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.

Я восстановил и снова попробовал с 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

Спасибо, это отлично. Сейчас запущу и, надеюсь, он покажет, на чём именно возникают проблемы.

Да, это сработало, показало, на чём именно возникли трудности, и оказалось, что в адресе электронной почты каким-то образом был недопустимый символ. Я исправил это, и всё заработало. Спасибо.