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()…
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:
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.
Olá @xrav3nz! Essa resposta é incrível!
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.