Problema con admin_detailed_user_serializer

Hola,

Tengo un problema con el admin_detailed_user_serializer que está causando errores 500 cuando un administrador intenta ver a un usuario desde la búsqueda de usuarios. El error 500 también ocurre al realizar llamadas API GET a https://mycommunity/admin/users/2000020409.json. A continuación, se muestra la excepción de los registros. Aproximadamente el 50% de los usuarios tienen este error. Intenté comparar usuarios que funcionan con los que no funcionan en la base de datos, pero no puedo determinar cuál podría ser el problema. Sospecho que algo que hice durante una migración de usuarios de otro sistema causó este problema.

A continuación, se detallan los pasos de mi migración de datos:

  1. Se insertaron datos manualmente en las tablas users, user_profiles, user_emails y user_stats.
  2. Inicialmente, todos los usuarios tenían un correo electrónico ‘someid@example.com’.
  3. Luego, actualicé la tabla user_email para que el usuario tuviera el correo electrónico correcto.
  4. Después de este punto, noté que el 50% de estos usuarios no se pueden ver desde la lista de usuarios del administrador. Sin embargo, si haces clic derecho en su nombre en la lista de perfiles, para que aparezca la tarjeta de perfil, puedes hacer clic allí y acceder al perfil sin problemas. Puedes realizar actualizaciones en el perfil, pero si intentas convertir a alguien en administrador, obtendrás el mismo error 500 que se indica a continuación.

¿Alguien sabe qué está comprobando este código? Supongo que a algunos usuarios les debe faltar una pieza crítica de datos que está causando esta excepción 500. ¿Alguien tiene alguna suposición? Soy nuevo en Discourse y cualquier consejo sería muy apreciado.

¡Gracias!


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

Probablemente esto no sea útil, pero parece que aquí es donde comenzó tu problema. Habría sido mucho mejor crear esos usuarios con Rails para que pudiera hacer todas las comprobaciones de los datos al crear usuarios.

Así que tal vez ese es el paso donde rompiste las cosas.

¿Está este sitio en línea o es un sitio de prueba donde puedes empezar de nuevo? Será mucho más fácil no romper las cosas que intentar averiguar qué está roto y luego cómo arreglarlo.

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’

¿Quizás eso significa que tienes usuarios con direcciones de correo electrónico duplicadas?

Editar: No creo que sea eso.

Lo que te recomiendo es que mires discourse/script/import_scripts at main · discourse/discourse · GitHub y encuentres un script en el que basar el tuyo y uses dicho script para importar los datos. A menos que tengas un conocimiento íntimo de Rails y Discourse, manipular directamente la base de datos es una receta para el desastre.

1 me gusta

Gracias por la respuesta, la aprecio. Desafortunadamente, este es un sitio de producción en vivo, por lo que estoy buscando alternativas en lugar de empezar de nuevo. Noté que cuando un usuario inicia sesión, su perfil se corrige y el mensaje de error 500 desaparece. Así que estoy tratando de averiguar qué sucede durante el proceso de inicio de sesión que corrige al usuario.

1 me gusta

¿Es esto? ¿Y al iniciar sesión añaden un valor a time_read?

2 Me gusta

¡Buen trabajo, @JammyDodger! ¡Apuesto a que esa es la solución!

Otra cosa a tener en cuenta es un método ensure_consistency en el modelo de usuario. Podrías buscar en el código fuente o simplemente intentar

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

O quizás sin el !

2 Me gusta