Проблема с admin_detailed_user_serializer

Здравствуйте,

У меня возникла проблема с admin_detailed_user_serializer, из-за которой возникают ошибки 500, когда администратор пытается просмотреть пользователя через поиск пользователей. Ошибка 500 также возникает при выполнении GET-запросов к API по адресу https://mycommunity/admin/users/2000020409.json. Ниже приведено исключение из логов. Около 50% пользователей подвержены этой ошибке. Я пытался сравнить работающих и неработающих пользователей в базе данных, но не смог понять, в чём может быть проблема. Подозреваю, что это последствие миграции пользователей из другой системы, которую я проводил.

Вот шаги моей миграции данных:

  1. Ручное внесение данных в таблицы users, user_profiles, user_emails и user_stats.
  2. Изначально у всех пользователей был адрес электронной почты вида ‘someid@example.com’.
  3. Затем я обновил таблицу user_emails для пользователей, чтобы указать правильные адреса.
  4. После этого я заметил, что 50% этих пользователей нельзя просмотреть из списка пользователей в админ-панели. Однако, если щёлкнуть правой кнопкой мыши по их имени в списке профилей, чтобы открыть карточку профиля, можно кликнуть внутри неё и перейти к профилю без проблем. Вы можете вносить изменения в профиль, но если попытаться назначить кого-либо администратором, вы получите ту же ошибку 500, которую я указал ниже.

Кто-нибудь знает, что именно проверяет этот код? Я предполагаю, что у некоторых пользователей отсутствует критически важный фрагмент данных, вызывающий это исключение 500. Есть ли у кого-нибудь какие-либо предположения? Я новичок в Discourse, и любая помощь будет очень кстати.

Спасибо!


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

Это, вероятно, не очень поможет, но похоже, что именно с этого началось возникновение вашей проблемы. Гораздо лучше было бы создать этих пользователей через Rails, чтобы система могла выполнить все проверки данных при создании пользователей.

Возможно, именно на этом этапе вы что-то нарушили.

Этот сайт работает в реальном режиме или это тестовый сайт, где вы можете начать заново? Гораздо проще избежать ошибок, чем пытаться понять, что сломано, и затем как это исправить.

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'

Возможно, это означает, что у вас есть пользователи с дублирующимися адресами электронной почты?

Редактирование: Я не думаю, что это так.

Что я рекомендую, так это заглянуть на discourse/script/import_scripts at main · discourse/discourse · GitHub, найти скрипт, на основе которого можно построить свой, и использовать такой скрипт для импорта данных. Если у вас нет глубокого понимания Rails и Discourse, прямое вмешательство в базу данных — это рецепт катастрофы.

Спасибо за ответ, я ценю это. К сожалению, это действующий продакшн-сайт, поэтому я ищу альтернативы, а не хочу начинать с нуля. Я заметил, что когда пользователь входит в систему, его профиль исправляется, и сообщение об ошибке 500 исчезает. Поэтому я пытаюсь понять, что происходит в процессе входа, что исправляет пользователя.

Это оно? И при входе они добавляют значение в time_read?

Отличная работа, @JammyDodger! Уверен, это именно то, что нужно!

Ещё один момент, на который стоит обратить внимание, — это метод ensure_consistency в модели пользователя. Вы можете посмотреть исходный код или просто попробовать:

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

Или, возможно, без !.