Excluir em massa usuários que correspondem a um padrão de e-mail

User.joins(:user_emails)
  .where('lower(user_emails.email) LIKE ?', '%domain.com')

Em particular, o caractere de porcentagem (%) é um curinga que representa zero ou mais de qualquer caractere. Portanto, %domain.com significa e-mails terminando com domain.com.

Em vez de User#destroy, o ideal é usar o UserDestroyer:

UserDestroyer.new(Discourse.system_user)
  .destroy(user, delete_posts: true)

Isso fará com que o usuário do sistema exclua o usuário e todas as suas postagens.

Para resumir:

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

Esteja ciente de que essa ação é irreversível. Você pode querer verificar os usuários selecionados pela consulta antes de realmente excluí-los. Além disso, não tenho certeza sobre as implicações de desempenho se você estiver excluindo um grande número de usuários e/ou se eles tiverem um grande número de postagens.

Outro ponto: não sei se Anonymizing Users in Discourse é uma alternativa para você?