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

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?