未読数が「未読 (14)」と表示されるが、/unread は空です

この素晴らしい木曜日の朝、皆さんに面白い難問を提起します。私のサイトで、誤って未読カウンターが表示されているようです。

発生している現象

トップナビゲーションに「未読 (14)」と表示されています。しかし、それをクリックして /unread に移動すると、未読トピックはリストされていません。ページには「未読のトピックはありません」と表示されます。

他の非スタッフユーザーも同様の問題に直面していますが、未読数は異なります。

iOS 版 Discourse アプリでも、未読トピックがないのに未読数が表示されることがあり、これもまた異なる数値になることがあります。

  • プラットフォーム: デスクトップ Web および iOS 版 Discourse アプリ
  • 影響範囲: 複数のユーザー
  • サイト: eurth.org

実施したテスト

セーフモードでテストを行いました:

  • https://eurth.org/?safe_mode=no_themes,no_plugins
  • https://eurth.org/unread?safe_mode=no_themes,no_plugins

この環境でも問題が発生するため、テーマやクライアントサイドのプラグインのカスタマイズが原因ではないようです。また、どのトピックにも「ささやき(whispers)」は存在しないため、それも原因ではないでしょう。

また、/unread で未読リストが空のときは**「Dismiss」ボタンが表示されない**ため、「Dismiss」を使用することもできません。

期待される動作

ナビゲーションに「未読 (14)」と表示されている場合、/unread には 14 の未読トピック、あるいは少なくともいくつかの未読トピックが表示されるはずです。

実際の動作

  • ナビゲーションに「未読 (14)」と表示
  • /unread は空
  • 「Dismiss」ボタンが表示されない
  • セーフモードでも問題が継続

質問

  • 特定のユーザーの未読状態を再構築またはリセットする方法は既知ですか?
  • /unread が空であっても未読数が維持されてしまうような、サーバーサイドの不整合は存在しますか?

以前、この問題について ask.discourse.org の AI に質問しましたが、最終的にはここにバグレポートを投稿するようアドバイスされました。

「いいね!」 1

ああ、あなたのサイトに「幻影の未読」が噛み付いたようです!

最近、カテゴリの権限を変更したり、トピックを安全なカテゴリに移動させたりしましたか?追跡状態が何らかの原因で変更されています。

他のユーザーも同様の問題を抱えているなら、全員に対してリセットしたいと思いませんか?

これは Rails コンソールを通じて全員に対して修正できると思いますが、少し複雑です。まず確認とテストを行う必要があります。今はモバイル端末からアクセスしていますが、もし他の誰かが解決策を投稿しないなら、少し待ってから投稿するつもりです。

「いいね!」 2

こんにちは、

このバグの存在は把握しており、解決に取り組んでいます。私たちもこの件にはうんざりしています:wink:

「いいね!」 3

はい。社内では、Documentation に似たカテゴリを構築しており、それが完成した直後に公開しました。

はい、その通りです。私の考えとしては、まず自分自身でテストしてから、全員に対して修正を行うつもりでした。このバグはテストするのが非常に複雑なため(少なくとも私にとっては)、解決策が確立されるまで、皆の期待を高めることはしたくなかったのです。

ご安心いただきありがとうございます。今朝、2026 年 5 月リリースv2026.05 に気づき、これで問題が解決するかと考えましたが、まだ続いています。チームが対応してくれていることは確信しています。Discourse は素晴らしいです。

ああ、なんてことでしょう。:flushed_face: 正直に言えば、関連する bug 報告をすべて読み通しました。一瞬、ナビゲーションから「未読」タブを非表示にして、無視することを考えました。でも、それでは何も解決しないですよね。どうやら、ここ Meta でもこの問題に付きまとわれているようです。

Screenshot 2026-05-28 at 13.52.18

「いいね!」 1

はい、この Rails スクリプトはグローバルな「すべて既読にする」機能として動作し、すべてのユーザーunread カウントを強制的に 0 に戻します。そのため、残念ながら、実際の未読数も含め、すべての未読数がクリアされてしまいます。これは Rails で SQL コマンドを実行することで可能です。ただし、根本的なバグを修正するわけではありません。また、最近のバックアップが手元にある場合は良いアイデアですが、私は開発用フォーラムでテストしており、正常に動作しました。

cd /var/discourse
./launcher enter app
rails c

以下のブロック全体を貼り付けて Enter キーを押してください。

sql = <<~SQL
  UPDATE topic_users
  SET last_read_post_number = topics.highest_post_number
  FROM topics
  WHERE topics.id = topic_users.topic_id
    AND COALESCE(topic_users.last_read_post_number, 0) < topics.highest_post_number
    AND topic_users.notification_level IN (2, 3, 4) -- Tracking, Watching, Watching First Post
SQL

# アップデートを実行
result = ActiveRecord::Base.connection.execute(sql)
puts "サイト全体で #{result.cmd_tuples} 件の未読トピックを正常にクリアしました。"

# クライアントブラウザにキャッシュされた状態を破棄させ、データベースと同期させる
MessageBus.publish("/topic-tracking-state", { clear: true })

ユーザーは強制的にページを再読み込み(ハードリフレッシュ)して、クリアされた unread 状態を確認する必要がある場合があります。