Come personalizzare l'algoritmo del punteggio hot topic con un plugin?

L’algoritmo integrato di Ordinamento per Popolarità (Hot sorting) è molto semplice e potrebbe non essere adatto a diversi casi d’uso. Dalla mia comprensione di base della codebase di Discourse, attualmente non ci sono impostazioni del sito visibili all’utente né un punto di iniezione di plugin appropriato per personalizzare l’algoritmo di ordinamento per popolarità. C’è un evento topic_hot_scores_updated ma viene chiamato dopo che i punteggi sono stati aggiornati, il che serve allo scopo di notifica senza la possibilità di sovrascrivere i punteggi di popolarità integrati. Ci sono due impostazioni del sito hot_topics_gravity e hot_topics_recent_days ma hanno hidden: true impostato e non sono visibili nell’interfaccia di amministrazione.

Stiamo considerando di scrivere un plugin per sostituire l’algoritmo di punteggio di popolarità integrato. Quale approccio sarebbe migliore in termini di compatibilità e facilità di aggiornamento di Discourse in futuro? Alcune delle mie idee sono elencate di seguito:

  • Fare monkey-patch di TopicHotScore e aggiornare il database secondo il nostro algoritmo personalizzato.
  • Creare una tabella separata per memorizzare i punteggi di popolarità degli argomenti ed eseguire un processo in background separato per aggiornarli. Aggiungere un altro percorso (invece di /hot) per il nostro elenco personalizzato di argomenti popolari.
  • O forse la codebase di Discourse potrebbe essere migliorata per supportare tale caso d’uso?
1 Mi Piace

Il più semplice, ma potrebbe essere limitato a seconda di ciò che si desidera fare.

Fattibile ma più complesso. Dai un’occhiata a come TopicQuery implementa le liste

e in particolare

  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

Puoi aggiungerne uno extra con relativa facilità, anche se ci sono parecchie parti in movimento da tenere in considerazione. L’ho fatto nel mio plugin ‘homepage-filter’ e potrebbe essere un buon punto di partenza.