Хорошо, этот скрипт Rails будет действовать как глобальная функция «Отметить все как прочитанное» и принудительно сбросит счётчик unread до 0 для всех пользователей, поэтому, к сожалению, он очистит любые корректные непрочитанные сообщения, а также любые фиктивные непрочитанные. Мы можем сделать это с помощью SQL-команды в Rails. Но имейте в виду, что это не исправляет корневую ошибку. Также это хорошая идея, если у вас есть свежая резервная копия, но я протестировал это на своём тестовом форуме, и всё сработало.
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) -- Отслеживание, Наблюдение, Наблюдение за первым сообщением
SQL
# выполнить обновление
result = ActiveRecord::Base.connection.execute(sql)
puts "Успешно очищено #{result.cmd_tuples} непрочитанных тем на всём сайте."
# принудительно заставить браузеры клиентов сбросить кэшированное состояние и синхронизироваться с базой данных
MessageBus.publish("/topic-tracking-state", { clear: true })
Пользователям, возможно, придётся выполнить жёсткую перезагрузку, чтобы увидеть очищённое состояние unread.