플러그인으로 인기 주제 점수 알고리즘을 어떻게 커스터마이즈하나요?

내장된 Hot sorting 알고리즘은 매우 단순하며 다양한 사용 사례에 적합하지 않을 수 있습니다. Discourse 코드베이스에 대한 기본적인 이해를 바탕으로, 현재 사용자 지정 Hot sorting 알고리즘을 커스터마이징하기 위한 사용자 대상 사이트 설정이나 적절한 플러그인 인젝션 포인트가 없습니다. topic_hot_scores_updated 이벤트가 하나 있지만, 이는 점수가 업데이트된 후에 호출되며, 내장 Hot 점수를 대체할 수 없는 알림 목적으로만 사용됩니다. hot_topics_gravity와 hot_topics_recent_days라는 두 개의 사이트 설정이 있지만, hidden: true가 설정되어 있어 관리자 UI에서 표시되지 않습니다.

우리는 내장 Hot 점수 알고리즘을 대체하는 플러그인을 작성하는 것을 고려하고 있습니다. 향후 Discourse 업그레이드의 호환성과 용이성 측면에서 어떤 접근 방식이 더 나은가요? 몇 가지 아이디어를 아래에 나열했습니다:

  • TopicHotScore를 monkey-patch하고 사용자 지정 알고리즘에 따라 DB를 업데이트합니다.
  • 토픽 Hot 점수를 저장하기 위해 별도의 테이블을 생성하고, 이를 업데이트하기 위해 별도의 백그라운드 작업을 실행합니다. 사용자 지정 Hot 토픽 목록을 위한 별도의 라우트(/hot 대신)를 추가합니다.
  • 또는 Discourse 코드베이스를 개선하여 이러한 사용 사례를 지원할 수 있을까요?

가장 쉽지만, 무엇을 하려는지에 따라 제한적일 수 있습니다.

가능하지만 더 복잡합니다. 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

고려해야 할 이동 부품(moving parts)이 꽤 많지만, 추가하는 것은 비교적 쉽습니다. 제 ‘homepage-filter’ 플러그인에서 그렇게 했으며, 이는 좋은 출발점이 될 수 있습니다.