¿Cómo personalizar el algoritmo de puntuación de temas populares con un plugin?

El algoritmo de clasificación en caliente incorporado es muy simple y podría no ser adecuado para diferentes casos de uso. Por mi comprensión básica de la base de código de Discourse, actualmente no hay configuraciones del sitio visibles para el usuario ni un punto de inyección de complemento apropiado para personalizar el algoritmo de clasificación en caliente. Hay un evento topic_hot_scores_updated, pero se llama después de que se actualizan las puntuaciones, lo que sirve para notificación sin la capacidad de anular las puntuaciones en caliente incorporadas. Hay dos configuraciones del sitio, hot_topics_gravity y hot_topics_recent_days, pero tienen hidden: true establecido y no son visibles en la interfaz de administración.

Estamos considerando escribir un complemento para reemplazar el algoritmo de puntuación en caliente incorporado. ¿Qué enfoque sería mejor en términos de compatibilidad y facilidad para actualizar Discourse en el futuro? Algunas de mis ideas se enumeran a continuación:

  • Hacer monkey-patch a TopicHotScore y actualizar la base de datos de acuerdo con nuestro algoritmo personalizado.
  • Crear una tabla separada para almacenar las puntuaciones en caliente de los temas y ejecutar un trabajo en segundo plano separado para actualizarlas. Agregar otra ruta (en lugar de /hot) para nuestra lista de temas populares personalizada.
  • ¿O tal vez la base de código de Discourse podría mejorarse para soportar tal caso de uso?
1 me gusta

El más fácil, pero podría ser limitado dependiendo de lo que quieras hacer.

Factible pero más complejo. Echa un vistazo a cómo TopicQuery implementa las listas

y específicamente

  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

Puedes agregar una adicional con relativa facilidad, aunque hay bastantes partes móviles que debes tener en cuenta. Hice eso en mi plugin ‘homepage-filter’ y ese podría ser un buen punto de partida.