Remover todos os usuários exceto administradores ou alguns usuários selecionados, o que for mais fácil

Existe um script rápido que me permitirá remover em massa todos os usuários, exceto administradores ou alguns poucos usuários selecionados identificados por seus IDs/e-mails? O que for mais fácil está bom.

Quero fazer isso a partir do console do Rails.

Obrigado.

 User.where(admin: false).destroy_all

Acho que isso deve resolver. Você pode executar o código acima sem o destroy_all para ver quais usuários são selecionados.

2 curtidas

Obrigado, destroy_all é o mesmo que UserDestroyer ou um é recomendado em vez do outro. Vi UserDestroyer mencionado algumas vezes em outros posts. Obrigado.

Agora está falhando com isto depois de excluir cerca de 200, mas agora está travado:

ActiveRecord::RecordInvalid: Validation failed: Primary email can't be blank
from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3/lib/active_record/validations.rb:80:in `raise_validation_error'

Eu pesquisei e encontrei um post sobre a verificação de e-mails bloqueados em Admin > Logs > E-mails Filtrados e nada está aparecendo, mas não sei o que fazer a seguir. Obrigado.

UserDestroyer é o que você deve usar. Ele excluirá outros dados associados ao usuário.

Não sei por que você obteve esse erro.

Você pode restaurar seu backup para antes de começar a exclusão e tentar o destroyer em vez disso.

1 curtida

Restaurei e tentei novamente com o UserDestroyer, mas ainda recebo esse erro. Há alguma forma de rastrear o que está causando isso?

Você pode usar um script do Rails ou o Explorador de Dados para verificar os endereços de e-mail e ver se algum está em branco… Embora isso seria estranho. Nenhum campo de e-mail está em branco por padrão, mesmo para contas geradas automaticamente como discobot ou system (que são administradores por padrão).

Seus usuários foram importados? Mas, mesmo assim, tenho certeza de que os métodos de criação de conta não permitem campos de e-mail em branco.

Usamos OAuth com um aplicativo personalizado. Fiz isso ontem, mas não retornou nenhum usuário:

User.joins(:user_emails).where(user_emails.email = \"\") e isso retornou nil, então não acho que nenhum esteja vazio.

Deve haver apenas um ou dois usuários, pois a maioria funciona, mas está travando instantaneamente no mesmo agora.

Meu script de exclusão é:

User.where(admin: false).find_each do |user| UserDestroyer.new(Discourse.system_user).destroy(user, delete_posts: true) end

Existe alguma maneira de exibir qual usuário está sendo processado no loop?

Você pode exibir os nomes de usuário e seus e-mails correspondentes:

User.where(admin: false).find_each do |user|
  puts "#{user.username}: #{user.email}"
  UserDestroyer.new(Discourse.system_user).destroy(user, delete_posts: true)
end
3 curtidas

Obrigado, isso é ótimo, vou executar isso agora e espero que me diga em quem está tendo dificuldades.

1 curtida

Sim, isso funcionou, mostrou-me com o que estava a ter dificuldades e era um caractere ilegal no e-mail de alguma forma, então atualizei isso e funcionou. Obrigado.

3 curtidas

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.