Массовое удаление пользователей, соответствующих шаблону email

Я хотел бы массово удалить пользователей, чьи email соответствуют шаблону, например:

  • *.xyz
  • *.fun
  • и т.д.

Пока я пробовал следующее: User.find(UserEmail.where("email like '%.fun'").pluck(:user_id)).count. Но после .where() я не могу использовать функцию destroy_all

Не могли бы вы помочь?
Огромное спасибо.

Я бы хотел сделать то же самое, а также удалить все сообщения и темы этих пользователей.

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?

Привет @xrav3nz! Этот ответ просто отличный! :open_mouth:
Это именно то, что мне нужно. Я попробую прямо сейчас, предварительно, конечно, подтвердив количество с помощью базового count(), как вы и предложили.

Одно замечание: разве не должно быть delete_post: true вместо false?

Мой случай использования очень прост: я импортировал старый phpBB (спасибо @gerhard), и всё работало отлично, но этот старый форум был полностью завален фейковыми аккаунтами… Они не писали ни одного сообщения. Все адреса электронной почты выглядели как .fun или .xyz.

Да, вы правы! Ошибка с моей стороны!