حسناً، سيعمل هذا السكربت الخاص بـ Rails كوظيفة عالمية لـ “تحديد الكل كمقروء”، مما يجبر عداد “غير المقروء” على العودة إلى 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) -- Tracking, Watching, Watching First Post
SQL
# تشغيل التحديث
result = ActiveRecord::Base.connection.execute(sql)
puts "تم مسح #{result.cmd_tuples} مواضيع غير مقروءة بنجاح على مستوى الموقع."
# إجبار متصفحات العملاء على إسقاط حالتها المخزنة ومزامنتها مع قاعدة البيانات
MessageBus.publish("/topic-tracking-state", { clear: true })
قد يحتاج المستخدمون إلى تحديث الصفحة قسرياً (hard refresh) لرؤية حالة «غير المقروء» الممسوحة.