مشكلة مع admin_detailed_user_serializer

أهلاً،

أواجه مشكلة في admin_detailed_user_serializer تسبب أخطاء 500 عندما يحاول مسؤول عرض مستخدم من خلال البحث عن المستخدمين. خطأ 500 يحدث أيضًا عند إجراء استدعاءات API من نوع GET إلى https://mycommunity/admin/users/2000020409.json. أدناه الاستثناء من السجلات. حوالي 50٪ من المستخدمين لديهم هذا الخطأ. حاولت مقارنة المستخدمين العاملين مقابل غير العاملين في قاعدة البيانات ولكن لا يمكنني معرفة ما هي المشكلة. أشك في أن شيئًا قمت به أثناء ترحيل مستخدم من نظام آخر تسبب في هذه المشكلة.

أدناه كانت خطوات ترحيل البيانات الخاصة بي:

  1. تم إدراج البيانات يدويًا في جداول users و user_profiles و user_emails و user_stats.
  2. في البداية كان لدى جميع المستخدمين بريد إلكتروني باسم ‘someid@example.com’.
  3. ثم قمت بتحديث جدول user_email للمستخدم ليكون لديه البريد الإلكتروني الصحيح.
  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، فإن العبث مباشرة بقاعدة البيانات هو وصفة لكارثة.

إعجاب واحد (1)

شكراً على الرد، أقدر ذلك. للأسف، هذا موقع إنتاج مباشر لذا أنا أبحث عن بدائل بدلاً من البدء من جديد. لقد لاحظت أنه عندما يقوم المستخدم بتسجيل الدخول، يتم إصلاح ملفه الشخصي وتختفي رسالة الخطأ 500. لذا أحاول معرفة ما يحدث أثناء عملية تسجيل الدخول الذي يصلح المستخدم.

إعجاب واحد (1)

هل هذا هو؟ ومن خلال تسجيل الدخول يضيفون قيمة إلى time_read؟

إعجابَين (2)

عمل رائع يا @JammyDodger! أراهن أن هذا هو الحل!

شيء آخر يجب البحث عنه هو طريقة ensure_consistency في نموذج المستخدم. يمكنك البحث في المصدر أو فقط المحاولة

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

أو ربما بدون !

إعجابَين (2)