Problème avec admin_detailed_user_serializer

Bonjour,

J’ai un problème avec le admin_detailed_user_serializer qui provoque des erreurs 500 lorsqu’un administrateur essaie de voir un utilisateur depuis la recherche d’utilisateurs. L’erreur 500 se produit également lors de l’appel de l’API GET à l’adresse https://mycommunity/admin/users/2000020409.json. Vous trouverez ci-dessous l’exception des journaux. Environ 50 % des utilisateurs rencontrent cette erreur. J’ai essayé de comparer les utilisateurs qui fonctionnent avec ceux qui ne fonctionnent pas dans la base de données, mais je n’arrive pas à trouver la cause du problème. Je suspecte que quelque chose que j’ai fait lors d’une migration d’utilisateurs d’un autre système a causé ce problème.

Voici les étapes de ma migration de données :

  1. Insertion manuelle de données dans les tables users, user_profiles, user_emails et user_stats.
  2. Initialement, tous les utilisateurs avaient un e-mail « someid@example.com ».
  3. J’ai ensuite mis à jour la table user_email pour que l’utilisateur ait le bon e-mail.
  4. Après cela, j’ai remarqué que 50 % de ces utilisateurs ne pouvaient pas être consultés dans la liste des administrateurs. Cependant, si vous cliquez avec le bouton droit sur leur nom dans la liste des profils pour faire apparaître la carte de profil, vous pouvez y accéder et accéder au profil sans problème. Vous pouvez apporter des modifications au profil, mais si vous essayez de faire d’une personne un administrateur, vous obtiendrez la même erreur 500 que celle que j’ai listée ci-dessous.

Quelqu’un sait-il ce que ce code vérifie ? Je suppose que certains utilisateurs doivent manquer une donnée critique qui cause cette exception 500. Avez-vous des hypothèses ? Je suis nouveau sur Discourse et tout conseil serait grandement apprécié.

Merci !


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

Ce n’est probablement pas utile, mais cela ressemble à l’endroit où votre problème a commencé. Il aurait été beaucoup mieux de créer ces utilisateurs avec Rails afin qu’il puisse effectuer toutes les vérifications sur les données lors de la création des utilisateurs.

C’est peut-être donc à cette étape que vous avez tout cassé.

Ce site est-il en ligne ou s’agit-il d’un site de test où vous pouvez recommencer ? Il sera beaucoup plus facile de ne pas tout casser que d’essayer de comprendre ce qui est cassé et comment le réparer.

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’

Cela signifie peut-être que vous avez des utilisateurs avec des adresses e-mail en double ?

Modification : Je ne pense pas que ce soit ça.

Ce que je vous recommande, c’est de regarder discourse/script/import_scripts at main · discourse/discourse · GitHub et de trouver un script sur lequel baser le vôtre et d’utiliser un tel script pour importer les données. À moins que vous n’ayez une connaissance approfondie de Rails et de Discourse, modifier directement la base de données est une recette pour le désastre.

1 « J'aime »

Merci pour votre réponse, j’apprécie. Malheureusement, il s’agit d’un site de production en direct, je cherche donc des alternatives plutôt que de recommencer. J’ai remarqué que lorsqu’un utilisateur se connecte, son profil est corrigé et le message d’erreur 500 disparaît. J’essaie donc de comprendre ce qui se passe pendant le processus de connexion qui corrige l’utilisateur.

1 « J'aime »

Est-ce que c’est ça ? Et en se connectant, ils ajoutent une valeur à time_read ?

2 « J'aime »

Excellent travail, @JammyDodger ! Je parie que c’est la solution !

Une autre chose à rechercher est une méthode ensure_consistency dans le modèle utilisateur. Vous pourriez regarder dans le code source ou simplement essayer

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

Ou peut-être sans le !

2 « J'aime »