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?