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?
1 „Gefällt mir“

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.