ユーザーデータアーカイブのエクスポートに失敗:DiscourseDataExplorer::QueryGroup のインスタンスには 'url' メソッドが未定義です

完全な開示: このバグレポートは、会話の後で ask.discourse を使用して作成しました。また、アップデートが追いついていないことは承知していますが、記憶が新しいうちに投稿したかったためです。

2つの異なるユーザーアカウントでこの問題を再現することができました。

サマリー

ユーザーデータアーカイブの要求(設定 → データのエクスポート → アーカイブをリクエスト)は、Data Explorer のグループレポートをブックマークしているユーザーに対して失敗します。Jobs::ExportUserArchive バックグラウンドジョブは Bookmarks 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. グループの Reports タブで、クエリの Bookmark をクリックし、それがブックマークされたグループレポートになるようにします。
  3. その同じユーザーとして、設定 → データのエクスポート → アーカイブをリクエスト に移動します。
  4. ジョブの失敗を確認します(Admin → Logs または 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 メソッドがありません(あるいは、コアのエクスポートジョブには、それを提供しないブックマーク可能タイプに対するガードが必要です)。

修正提案

DiscourseDataExplorer::QueryGroup に url メソッドを実装するか、コアの bookmarks_export を防御的に変更する(例: bookmarkable.respond_to?(:url) / 行ごとに rescue)ことで、サポートされていない単一のブックマーク可能タイプがエクスポート全体を停止できないようにしてください。

回避策

問題のあるブックマーク(影響を受けるユーザーの bookmarks テーブル内の bookmarkable_type = 'DiscourseDataExplorer::QueryGroup' の行)を削除すると、エクスポートが完了するようになります。