Problema con admin_detailed_user_serializer

Ciao,

Ho un problema con il admin_detailed_user_serializer che causa errori 500 quando un amministratore tenta di visualizzare un utente dalla ricerca utenti. L’errore 500 si verifica anche quando si effettuano chiamate API GET a https://mycommunity/admin/users/2000020409.json. Di seguito è riportata l’eccezione dai log. Circa il 50% degli utenti presenta questo errore. Ho provato a confrontare gli utenti funzionanti e quelli non funzionanti nel database ma non riesco a capire quale sia il problema. Sospetto che qualcosa che ho fatto durante una migrazione utente da un altro sistema abbia causato questo problema.

Di seguito sono stati i miei passaggi di migrazione dati:

  1. Inseriti manualmente i dati nelle tabelle users, user_profiles, user_emails e user_stats.
  2. Inizialmente tutti gli utenti avevano un’email ‘someid@example.com’.
  3. Ho quindi aggiornato la tabella user_email per l’utente in modo che avesse l’email corretta.
  4. Dopo questo punto, ho notato che il 50% di questi utenti non può essere visualizzato dall’elenco utenti dell’amministratore. Tuttavia, se si fa clic con il pulsante destro del mouse sul loro nome nell’elenco dei profili per far apparire la scheda del profilo, è possibile fare clic al suo interno e accedere al profilo senza problemi. È possibile apportare modifiche al profilo ma se si tenta di rendere qualcuno un amministratore si otterrà lo stesso errore 500 che ho elencato di seguito.

Qualcuno sa cosa sta controllando questo codice? Suppongo che ad alcuni utenti debba mancare un pezzo critico di dati che causa questa eccezione 500. Qualcuno ha qualche ipotesi? Sono nuovo a Discourse e qualsiasi consiglio sarebbe molto apprezzato.

Grazie!


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

Questo probabilmente non è utile, ma sembra che sia da qui che è iniziato il tuo problema. Sarebbe stato molto meglio creare quegli utenti con Rails in modo che potesse eseguire tutti i controlli sui dati durante la creazione degli utenti.

Quindi forse è questo il passaggio in cui hai rotto le cose.

Questo sito è online o è un sito di test in cui puoi ricominciare? Sarà molto più facile non rompere le cose che cercare di capire cosa è rotto e poi come risolverlo.

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’

Forse significa che hai utenti con indirizzi email duplicati?

Modifica: non credo sia questo.

Quello che ti consiglio è di guardare discourse/script/import_scripts at main · discourse/discourse · GitHub e trovare uno script su cui basare il tuo e usare tale script per importare i dati. A meno che tu non abbia una profonda conoscenza di Rails e Discourse, manomettere direttamente il database è una ricetta per il disastro.

1 Mi Piace

Grazie per la risposta, la apprezzo. Sfortunatamente questo è un sito di produzione live, quindi sto valutando alternative piuttosto che ricominciare da capo. Ho notato che quando un utente accede, il suo profilo viene corretto e il messaggio di errore 500 scompare. Quindi sto cercando di capire cosa succede durante il processo di accesso che corregge l’utente.

1 Mi Piace

È questo? E accedendo aggiungono un valore a time_read?

2 Mi Piace

Bel lavoro, @JammyDodger! Scommetto che è la soluzione!

Un’altra cosa da cercare è un metodo ensure_consistency nel modello utente. Potresti guardare nel codice sorgente o semplicemente provare

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

O forse senza il !

2 Mi Piace