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

Gostaria de excluir em massa usuários que correspondam a um padrão de e-mail, como:

  • *.xyz
  • *.fun
  • etc..

Até agora, tentei o seguinte: User.find(UserEmail.where("email like '%.fun'").pluck(:user_id)).count. Mas não consigo usar a função destroy_all após um .where()

Poderia me ajudar, por favor?
Muito obrigado.

Gostaria de fazer o mesmo, além de excluir todos os posts/tópicos desses usuários também.

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

Olá @xrav3nz! Essa resposta é incrível! :open_mouth:
Isso é exatamente o que eu preciso. Vou testar agora mesmo, claro, confirmando primeiro a quantidade com um count() básico, como você sugeriu.

Uma observação: não deveria ser delete_post: true em vez de false?

Meu caso de uso é muito simples: importei um phpBB antigo (graças ao @gerhard) e funcionou perfeitamente, mas esse fórum antigo estava totalmente poluído por contas falsas. Elas não postaram nenhuma mensagem. Todos os endereços de e-mail pareciam .fun ou .xyz.

Sim, você está certo! Foi um erro de digitação da minha parte!