L'archiviazione dei dati utente non riesce: metodo 'url' indefinito per un'istanza di DiscourseDataExplorer::QueryGroup

Piena trasparenza: ho utilizzato ask.discourse per redigere questa segnalazione di bug dopo una conversazione. Inoltre, so che sono in ritardo con gli aggiornamenti, ma volevo pubblicare questo messaggio mentre era ancora fresco nella mia mente.

Sono riuscito a riprodurre il problema su due diversi account utente.

Riepilogo

La richiesta di un archivio dei dati dell’utente (Preferenze → Esporta i tuoi dati → Richiedi archivio) fallisce per gli utenti che hanno messo nei preferiti (bookmark) un report di gruppo Data Explorer. Il job in background Jobs::ExportUserArchive si blocca durante la generazione del CSV dei preferiti, quindi l’esportazione non viene mai completata e nessun link di download viene inviato.

Ambiente

  • Versione Discourse: 2026.8.0-latest.1
  • Data Explorer: incluso nel core (la versione segue quella del core)
  • Self-hosted / gestito: self-hosted
  • Stack Ruby/Rails secondo lo stack trace: activemodel/activerecord 8.0.5.1, Sidekiq 7.3.10

Passaggi per riprodurre

  1. Come amministratore, crea una query Data Explorer e concedi l’accesso a un gruppo.
  2. Nella scheda Report del gruppo, fai clic su Aggiungi ai preferiti sulla query affinché diventi un report di gruppo preferito.
  3. Come quello stesso utente, vai su Preferenze → Esporta i tuoi dati → Richiedi archivio.
  4. Osserva il fallimento del job (controlla Amministrazione → Log o i log di Sidekiq).

Comportamento atteso

L’archivio dell’utente dovrebbe essere generato e l’utente dovrebbe ricevere il link di download, inclusi i propri preferiti.

Comportamento effettivo

Il job di esportazione genera un’eccezione e l’archivio fallisce. Lo stack trace mostra che il crash si verifica in bookmarks_export, dove il job chiama .url sull’oggetto preferito:

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

Stack trace (ridotto ai frame rilevanti):

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'

Analisi

I preferiti sono polimorfici. Il job di esportazione chiama bookmarkable.url, che funziona per i tipi di preferiti nativi (Topic, Post), ma DiscourseDataExplorer::QueryGroup non implementa url, quindi il job genera NoMethodError al primo preferito di questo tipo.

Sembra che Data Explorer registri i gruppi di query come preferibili (tramite il pulsante Aggiungi ai preferiti del report di gruppo), ma il modello manca del metodo url (oppure il job di esportazione principale necessita di una guardia per i tipi di preferiti che non ne forniscono uno).

Correzione suggerita

Implementare un metodo url su DiscourseDataExplorer::QueryGroup, oppure rendere difensivo bookmarks_export del core (ad esempio, bookmarkable.respond_to?(:url) / rescue per riga) in modo che un singolo tipo di preferito non supportato non possa bloccare l’intera esportazione.

Soluzione temporanea

Eliminare i preferiti problematici (righe in bookmarks dove bookmarkable_type = 'DiscourseDataExplorer::QueryGroup' per l’utente interessato) consente all’esportazione di completarsi.