كيف تقوم بتخصيص خوارزمية نقاط الموضوع الشائع باستخدام إضافة؟

خوارزمية الترتيب الساخن المضمنة بسيطة جدًا وقد لا تكون مناسبة لحالات الاستخدام المختلفة. من فهمي الأساسي لقاعدة بيانات Discourse، لا يوجد حاليًا إعداد موقع يواجه المستخدم أو نقطة حقن مناسبة للإضافات (plugin injection point) لتخصيص خوارزمية الترتيب الساخن. يوجد حدث واحد هو topic_hot_scores_updated ولكنه يُستدعى بعد تحديث الدرجات، مما يخدم غرض الإشعار دون القدرة على تجاوز الدرجات الساخنة المضمنة. هناك إعدادان للموقع هما hot_topics_gravity و hot_topics_recent_days ولكنهما مضبوطان على hidden: true وغير مرئيين في واجهة مسؤول النظام (admin UI).

نحن نفكر في كتابة إضافة (plugin) لاستبدال خوارزمية الدرجات الساخنة المضمنة. ما هو النهج الأفضل من حيث التوافق وسهولة ترقية Discourse في المستقبل؟ بعض أفكاري مدرجة أدناه:

  • استخدام التصحيح السريع (Monkey-patch) لـ TopicHotScore وتحديث قاعدة البيانات وفقًا لخوارزميتنا المخصصة.
  • إنشاء جدول منفصل لتخزين الدرجات الساخنة للمواضيع وتشغيل مهمة خلفية منفصلة لتحديثها. إضافة مسار آخر (بدلاً من /hot) لقائمة المواضيع الساخنة المخصصة لدينا.
  • أو ربما يمكن تحسين قاعدة بيانات Discourse لدعم حالة الاستخدام هذه؟
إعجاب واحد (1)

الأسهل ولكنه قد يكون محدودًا اعتمادًا على ما تريد القيام به.

ممكن التنفيذ ولكنه أكثر تعقيدًا. ألقِ نظرة على كيفية تنفيذ TopicQuery للقوائم

وبالتحديد

  def list_hot
    create_list(:hot, unordered: true, prioritize_pinned: true) do |topics|
      topics = remove_muted(topics, user, options)
      topics.joins("JOIN topic_hot_scores on topics.id = topic_hot_scores.topic_id").order(
        "topic_hot_scores.score DESC",
      )
    end
  end

يمكنك إضافة واحد إضافي بسهولة نسبية على الرغم من وجود العديد من الأجزاء المتحركة التي تحتاج إلى أخذها في الاعتبار. لقد فعلت ذلك في الإضافة الخاصة بي ‘homepage-filter’ وقد تكون نقطة انطلاق جيدة.