User.joins(:user_emails)
.where('lower(user_emails.email) LIKE ?', '%domain.com')
En particular, el signo de porcentaje (%) es un comodín que representa cero o más caracteres cualesquiera. Por lo tanto, %domain.com significa correos electrónicos que terminan con domain.com.
En lugar de User#destroy, lo mejor es utilizar UserDestroyer:
UserDestroyer.new(Discourse.system_user)
.destroy(user, delete_posts: true)
Esto hará que el usuario del sistema elimine al usuario y todas sus publicaciones.
Para resumirlo:
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
Ten en cuenta que esto es irreversible. Es posible que quieras verificar los usuarios seleccionados por la consulta antes de eliminarlos realmente. Además, no estoy seguro de las implicaciones en el rendimiento si estás eliminando un gran número de usuarios y/o si tienen un gran número de publicaciones.
Por otro lado, no sé si Anonymizing Users in Discourse podría ser una alternativa para ti.