fangjue
(方觉)
1
内置的 热门排序 算法 非常简单,可能不适用于不同的使用场景。根据我对 Discourse 代码库的基本理解,目前没有面向用户的站点设置或适当的插件注入点来定制热门排序算法。有一个 topic_hot_scores_updated 事件,但它在分数更新后才被调用,这可以用于通知,但不能覆盖内置的热门分数。有两个站点设置 hot_topics_gravity 和 hot_topics_recent_days,但它们被设置为 hidden: true 并且在管理员界面中不可见。
我们正在考虑编写一个插件来替换内置的热门分数算法。从与未来升级 Discourse 的兼容性和便捷性来看,哪种方法会更好?我列出了一些想法如下:
- Monkey-patch
TopicHotScore 并根据我们的自定义算法更新数据库。
- 创建一个单独的表来存储热门分数,并运行一个单独的后台作业来更新它们。为我们的自定义热门话题列表添加另一个路由(而不是 /hot)。
- 或者也许 Discourse 代码库可以改进以支持这种用例?
1 个赞
RGJ
(Richard - Communiteq)
2
最简单,但根据您想做的事情,可能会有所限制。
可行,但更复杂。请查看 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’ 插件中这样做了,那可能是一个很好的起点。