فشل تصدير أرشيف بيانات المستخدم: طريقة 'url' غير معرّفة لمجموعة DiscourseDataExplorer::QueryGroup

إفصاح كامل لقد استخدمت ask.discourse لكتابة تقرير هذا الخطأ بعد محادثة. أيضًا، أعلم أنني متأخر عن التحديثات، لكنني أردت نشر هذا بينما لا يزال طازجًا في ذاكرتي.

تمكنت من إعادة إنتاج هذه المشكلة على حسابين مستخدمين مختلفين.

الملخص

يُفشل طلب أرشيف بيانات المستخدم (التفضيلات → تصدير بياناتك → طلب الأرشيف) للمستخدمين الذين قاموا بوضع علامة مرجع (Bookmark) على تقرير مجموعة Data Explorer. ينهار عمل الخلفية Jobs::ExportUserArchive أثناء إنشاء ملف CSV للعلامات المرجعية، لذا لا يكتمل التصدير أبدًا ولا يُرسل رابط التنزيل.

البيئة

  • إصدار Discourse: 2026.8.0-latest.1
  • Data Explorer: مدمج مع النواة (الإصدار يتبع النواة)
  • استضافة ذاتية / مُستضافة: استضافة ذاتية
  • حزمة Ruby/Rails وفقًا لتتبّع المكالمة: activemodel/activerecord 8.0.5.1، Sidekiq 7.3.10

خطوات إعادة الإنتاج

  1. بصفتك مديرًا، أنشئ استعلامًا في Data Explorer ومنح الوصول إلى مجموعة.
  2. في تبويب التقارير الخاص بالمجموعة، انقر على وضع علامة مرجع على الاستعلام ليصبح تقرير مجموعة مُعلَّمًا بالمرجع.
  3. بصفتك ذلك المستخدم نفسه، انتقل إلى التفضيلات → تصدير بياناتك → طلب الأرشيف.
  4. شاهد فشل العمل (تحقق من الإدارة → السجلات أو سجلات Sidekiq).

السلوك المتوقع

يجب أن يتم إنشاء أرشيف المستخدم ويجب أن يستلم المستخدم رابط التنزيل، بما في ذلك علاماته المرجعية.

السلوك الفعلي

يرفع عمل التصدير استثناءً ويفشل الأرشيف. يُظهر تتبّع المكالمة حدوث الانهيار في bookmarks_export، حيث يستدعي العمل .url على الكائن المُعلَّم بالمرجع:

Job exception: undefined method 'url' for an instance of DiscourseDataExplorer::QueryGroup

تتبّع المكالمة (مختصر للإطارات ذات الصلة):

activemodel-8.0.5.1/lib/active_model/attribute_methods.rb:512:in 'ActiveModel::AttributeMethods#method_missing'
activerecord-8.0.5.1/lib/active_record/attribute_methods.rb:495:in 'ActiveRecord::AttributeMethods#method_missing'
/var/www/discourse/app/jobs/regular/export_user_archive.rb:325:in 'block in Jobs::ExportUserArchive#bookmarks_export'
activerecord-8.0.5.1/lib/active_record/relation/delegation.rb:101:in 'Array#each'
activerecord-8.0.5.1/lib/active_record/relation/delegation.rb:101:in 'ActiveRecord::Delegation#each'
/var/www/discourse/app/jobs/regular/export_user_archive.rb:319:in 'Jobs::ExportUserArchive#bookmarks_export'
/var/www/discourse/app/jobs/regular/export_user_archive.rb:170:in 'Kernel#public_send'
/var/www/discourse/app/jobs/regular/export_user_archive.rb:170:in 'block (2 levels) in Jobs::ExportUserArchive#execute'
/var/www/discourse/app/jobs/regular/export_user_archive.rb:168:in 'block in Jobs::ExportUserArchive#execute'

التحليل

العلامات المرجعية متعددة الأشكال (polymorphic). يستدعي عمل التصدير bookmarkable.url، وهو ما يعمل لأنواع العلامات المرجعية الأساسية (Topic, Post)، لكن DiscourseDataExplorer::QueryGroup لا ينفذ url، لذا يرفع العمل NoMethodError عند أول علامة مرجعية من هذا النوع.

يبدو أن Data Explorer يسجل مجموعات الاستعلامات ككيانات قابلة للوضع كعلامة مرجعية (عبر زر Bookmark لتقرير المجموعة)، لكن النموذج يفتقر إلى طريقة url (أو يحتاج عمل التصدير الأساسي إلى حارس لأنواع القابلة للوضع كعلامة مرجعية لا توفرها).

الإصلاح المقترح

إما تنفيذ طريقة url على DiscourseDataExplorer::QueryGroup، أو جعل bookmarks_export الأساسي دفاعيًا (على سبيل المثال، bookmarkable.respond_to?(:url) / استرداد لكل صف) بحيث لا يمكن لنوع قابل للوضع كعلامة مرجعية غير مدعوم واحد أن يقتل التصدير بأكمله.

حل مؤقت

يسمح حذف العلامات المرجعية المعيبة (صفوف في bookmarks حيث bookmarkable_type = 'DiscourseDataExplorer::QueryGroup' للمستخدم المتأثر) بإكمال التصدير.