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ê?