Problema com admin_detailed_user_serializer

Olá,

Estou tendo um problema com o admin_detailed_user_serializer que está causando erros 500 quando um administrador tenta visualizar um usuário na pesquisa de usuários. O erro 500 também está ocorrendo ao fazer chamadas de API GET para https://mycommunity/admin/users/2000020409.json. Abaixo está a exceção dos logs. Cerca de 50% dos usuários estão tendo esse erro. Tentei comparar usuários que funcionam com os que não funcionam no banco de dados, mas não consigo descobrir qual é o problema. Suspeito que algo que fiz durante uma migração de usuários de outro sistema causou esse problema.

Abaixo estão as etapas da minha migração de dados:

  1. Inseri manualmente dados nas tabelas users, user_profiles, user_emails e user_stats.
  2. Inicialmente, todos os usuários tinham um e-mail ‘someid@example.com’.
  3. Em seguida, atualizei a tabela user_email para que o usuário tivesse o e-mail correto.
  4. Após este ponto, notei que 50% desses usuários não podem ser visualizados na lista de usuários do administrador. No entanto, se você clicar com o botão direito do mouse no nome deles na lista de perfis, para que o cartão de perfil apareça, você pode clicar nele e acessar o perfil sem problemas. Você pode fazer atualizações no perfil, mas se tentar tornar alguém um administrador, receberá o mesmo erro 500 que listei abaixo.

Alguém sabe o que este código está verificando? Imagino que alguns usuários devem estar faltando uma peça crítica de dados que está causando essa exceção 500. Alguém tem alguma ideia? Sou novo no Discourse e qualquer conselho seria muito apreciado.

Obrigado!


app/serializers/admin_user_list_serializer.rb:95:in `time_read'
(eval):27:in `_fast_attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:468:in `rescue in attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:455:in `attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:480:in `_serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:359:in `serializable_hash'
active_model_serializers (0.8.4) lib/active_model/array_serializer.rb:89:in `block in _serializable_array'
activerecord (7.0.4.3) lib/active_record/relation/delegation.rb:88:in `each'
activerecord (7.0.4.3) lib/active_record/relation/delegation.rb:88:in `each'
active_model_serializers (0.8.4) lib/active_model/array_serializer.rb:79:in `map'
active_model_serializers (0.8.4) lib/active_model/array_serializer.rb:79:in `_serializable_array'
active_model_serializers (0.8.4) lib/active_model/array_serializer.rb:73:in `serializable_array'
active_model_serializers (0.8.4) lib/active_model/array_serializer.rb:53:in `as_json'
app/serializers/admin_detailed_user_serializer.rb:166:in `similar_users'
(eval):72:in `_fast_attributes'
active_model_serializers (0.8.4

Isso provavelmente não é útil, mas parece ser onde seu problema começou. Teria sido muito melhor criar esses usuários com o Rails para que ele pudesse fazer todas as verificações nos dados ao criar usuários.

Então, talvez seja essa a etapa em que você quebrou as coisas.

Este site está no ar ou é um site de teste onde você pode recomeçar? Será muito mais fácil não quebrar as coisas do que tentar descobrir o que está quebrado e como consertar.

active_model_serializers (0.8.4) lib/active_model/array_serializer.rb:53:in as_json' app/serializers/admin_detailed_user_serializer.rb:166:in similar_users’
(eval):72:in `_fast_attributes’

Talvez isso signifique que você tem usuários com endereços de e-mail duplicados?

Editar: Acho que não é isso.

O que eu recomendo é que você olhe em discourse/script/import_scripts at main · discourse/discourse · GitHub e encontre um script para se basear e use tal script para importar os dados. A menos que você tenha um entendimento íntimo de Rails e Discourse, mexer diretamente com o banco de dados é uma receita para o desastre.

1 curtida

Obrigado pela resposta, eu aprecio. Infelizmente, este é um site de produção ativo, então estou procurando alternativas em vez de começar de novo. Notei que quando um usuário faz login, o perfil dele é corrigido e a mensagem de erro 500 desaparece. Então, estou tentando descobrir o que acontece durante o processo de login que corrige o usuário.

1 curtida

É isso? E ao fazer login eles adicionam um valor a time_read?

2 curtidas

Bom trabalho, @JammyDodger! Aposto que é isso!

Outra coisa a procurar é um método ensure_consistency no modelo do usuário. Você pode procurar no código-fonte ou apenas tentar

u=User.find(123)
u.ensure_consistency!

Ou talvez sem o !

2 curtidas