Export des Benutzerdatenarchivs schlägt fehl: undefined method 'url' for an instance of DiscourseDataExplorer::QueryGroup

Vollständige Offenlegung: Ich habe diese Fehlermeldung mit ask.discourse nach einem Gespräch erstellt. Außerdem weiß ich, dass ich mit den Updates hinterherhänge, aber ich wollte dies posten, solange es noch frisch in meinem Gedächtnis war.

Ich konnte das Problem auf zwei verschiedenen Benutzerkonten reproduzieren.

Zusammenfassung

Die Anforderung eines Benutzerdatenarchivs (Einstellungen → Exportiere deine Daten → Archiv anfordern) schlägt für Benutzer fehl, die einen Gruppenbericht des Data Explorers als Lesezeichen gespeichert haben. Der Hintergrundjob Jobs::ExportUserArchive stürzt beim Erstellen der Bookmarks-CSV ab, sodass der Export nie abgeschlossen wird und kein Downloadlink gesendet wird.

Umgebung

  • Discourse-Version: 2026.8.0-latest.1
  • Data Explorer: Im Kern enthalten (Version folgt dem Kern)
  • Selbst gehostet / gehostet: selbst gehostet
  • Ruby/Rails-Stack gemäß Backtrace: activemodel/activerecord 8.0.5.1, Sidekiq 7.3.10

Schritte zur Reproduktion

  1. Erstelle als Administrator eine Data-Explorer-Abfrage und gewähre einer Gruppe Zugriff.
  2. Klicke im Tab Berichte der Gruppe auf Lesezeichen, damit die Abfrage zu einem gruppierten Bericht mit Lesezeichen wird.
  3. Gehe als dieser gleiche Benutzer zu Einstellungen → Exportiere deine Daten → Archiv anfordern.
  4. Beobachte das Scheitern des Jobs (prüfe Admin → Protokolle oder die Sidekiq-Protokolle).

Erwartetes Verhalten

Das Benutzerarchiv sollte erstellt werden und der Benutzer sollte den Downloadlink erhalten, einschließlich seiner Lesezeichen.

Tatsächliches Verhalten

der Exportjob löst eine Ausnahme aus und das Archiv schlägt fehl. Die Backtrace zeigt, dass der Absturz in bookmarks_export auftritt, wo der Job .url auf dem markierten Objekt aufruft:

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

Backtrace (auf die relevanten Frames gekürzt):

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'

Analyse

Lesezeichen sind polymorph. Der Exportjob ruft bookmarkable.url auf, was für Kern-Lesezeichen-Typen (Topic, Post) funktioniert, aber DiscourseDataExplorer::QueryGroup implementiert url nicht, sodass der Job bei dem ersten solchen Lesezeichen NoMethodError auslöst.

Es scheint, dass Data Explorer Abfragegruppen als markierbar registriert (über die Lesezeichen-Schaltfläche des Gruppenberichts), aber das Modell fehlt die Methode url (oder der Kern-Exportjob benötigt eine Sicherung für markierbare Typen, die keine bereitstellen).

Vorschlag zur Behebung

Entweder implementiere eine url-Methode für DiscourseDataExplorer::QueryGroup, oder mache bookmarks_export im Kern defensiver (z. B. bookmarkable.respond_to?(:url) / rescue pro Zeile), damit ein einzelner nicht unterstützter markierbarer Typ den gesamten Export nicht zum Erliegen bringen kann.

Workaround

Das Löschen der betreffenden Lesezeichen (Zeilen in bookmarks, bei denen bookmarkable_type = 'DiscourseDataExplorer::QueryGroup' für den betroffenen Benutzer) ermöglicht den Abschluss des Exports.