Wie passt man den Hot Topic Score Algorithmus mit einem Plugin an?

Der eingebaute Hot-Sortieralgorithmus (Algorithm) ist sehr einfach und möglicherweise nicht für verschiedene Anwendungsfälle geeignet. Nach meinem grundlegenden Verständnis des Discourse-Codebestands gibt es derzeit keine für den Benutzer sichtbare Site-Einstellung oder einen geeigneten Plugin-Injektionspunkt zur Anpassung des Hot-Sortieralgorithmus. Es gibt ein topic_hot_scores_updated-Ereignis, das jedoch aufgerufen wird, nachdem die Ergebnisse aktualisiert wurden, was dem Zweck der Benachrichtigung dient, ohne die Möglichkeit, die integrierten Hot-Ergebnisse zu überschreiben. Es gibt zwei Site-Einstellungen, hot_topics_gravity und hot_topics_recent_days, aber diese sind auf hidden: true gesetzt und im Admin-UI nicht sichtbar.

Wir erwägen, ein Plugin zu schreiben, um den integrierten Hot-Score-Algorithmus zu ersetzen. Welcher Ansatz wäre in Bezug auf Kompatibilität und einfache Aktualisierung von Discourse in Zukunft besser? Einige meiner Ideen sind unten aufgeführt:

  • Monkey-Patch TopicHotScore und Aktualisierung der Datenbank gemäß unserem benutzerdefinierten Algorithmus.
  • Erstellen einer separaten Tabelle zum Speichern der Hot-Scores von Themen und Ausführen eines separaten Hintergrundjobs zur Aktualisierung dieser. Hinzufügen einer weiteren Route (anstelle von /hot) für unsere benutzerdefinierte Auflistung heißer Themen.
  • Oder vielleicht könnte der Discourse-Code verbessert werden, um einen solchen Anwendungsfall zu unterstützen?

Am einfachsten, könnte aber je nachdem, was Sie tun möchten, eingeschränkt sein.

Machbar, aber komplexer. Werfen Sie einen Blick darauf, wie TopicQuery Listen implementiert

und speziell

  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

Sie können relativ einfach eine zusätzliche hinzufügen, obwohl Sie einige bewegliche Teile berücksichtigen müssen. Ich habe das in meinem Plugin ‘homepage-filter’ getan, und das könnte ein guter Ausgangspunkt sein.