ホットトピックのスコアアルゴリズムをプラグインでカスタマイズする方法は?

組み込みのホットソート アルゴリズムは非常に単純で、さまざまなユースケースに適さない場合があります。Discourseのコードベースに関する私の基本的な理解では、現在、ホットソートアルゴリズムをカスタマイズするためのユーザー向けのサイト設定や適切なプラグインインジェクションポイントはありません。スコアが更新されたに呼び出されるtopic_hot_scores_updatedイベントが1つありますが、これは組み込みのホットスコアを上書きする機能なしに通知の目的を果たします。hot_topics_gravityhot_topics_recent_daysという2つのサイト設定がありますが、これらはhidden: trueが設定されており、管理UIには表示されません。

組み込みのホットスコアアルゴリズムを置き換えるプラグインを作成することを検討しています。互換性と将来のDiscourseのアップグレードの容易さという点で、どの方法がより良いでしょうか?私の考えをいくつか以下に示します。

  • 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’ プラグインで行い、それは良い出発点になるかもしれません。