Я хотел бы массово удалить пользователей, чьи 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:
Это позволит системному пользователю удалить пользователя и все его сообщения.
Подводя итог:
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
Имейте в виду, что это действие необратимо. Возможно, стоит проверить выбранных запросом пользователей перед их фактическим удалением. Также я не уверен в последствиях для производительности, если вы удаляете большое количество пользователей и/или если у них много сообщений.
Привет @xrav3nz! Этот ответ просто отличный!
Это именно то, что мне нужно. Я попробую прямо сейчас, предварительно, конечно, подтвердив количество с помощью базового count(), как вы и предложили.
Одно замечание: разве не должно быть delete_post: true вместо false?
Мой случай использования очень прост: я импортировал старый phpBB (спасибо @gerhard), и всё работало отлично, но этот старый форум был полностью завален фейковыми аккаунтами… Они не писали ни одного сообщения. Все адреса электронной почты выглядели как .fun или .xyz.