利用 `bumped_at` 实现类似 Reddit 的排序

我正在 Discourse 上运营一个新闻/政治讨论论坛。我遇到的问题是,Discourse 默认的排序方式在我的使用场景下会导致完全混乱,因为话题的发布时间对我而言至关重要。对于像我这样的论坛,Reddit 风格的排序最为合理,但据我了解,目前没有直接的方法可以实现这一点。

我在想,是否可以通过“滥用”bumped_at 字段来实现 Reddit 风格的排序,例如执行以下操作:

def topic_hotness(created_at, like_count)
   /**
      此函数通过数学公式将 created_at 和 like_count
      转换为 bumped_at 日期,其原理类似于 Reddit 使用的算法。
      请将 bumped_at 视为一个截止日期:考虑到话题的创建时间和点赞数,
      我们需要话题在此日期之前保持在前十的位置。
   */
end

add_model_callback(Topic, :before_save) do
   self.bumped_at = topic_hotness(self.created_at, self.like_count)
end

这样做可行吗?它可能会破坏哪些功能,需要如何解决?我在 Discourse 代码库中看到过,如果 bumped_at 是未来时间,系统会抛出异常。根据公式的不同,这种方案可能会导致 bumped_at 设置为未来时间。大家有什么看法?

有人吗?

抱歉顶一下。

不。如果你想要类似 Reddit 的功能,请使用现成的众多 Reddit 克隆网站之一。

遗憾的是,目前市面上没有任何产品能与 Discourse 的质量相媲美,因此 Discourse 是我唯一的选择。事实上,Discourse 几乎满足了该用例的所有需求,唯独缺少首页排序功能。过去我曾见过类似的请求(虽然数量不多),希望这能为未来更多的人提供帮助。

嗯,你这么说真是太客气了 :wink:

不过,我们严格坚持对话中的时间顺序排序,仅辅以极薄的线程功能。或许你可以看看 Solved 插件

另一种选择是将您的网站首页设置为 /top/top/daily

哈哈,我之所以这么说,是因为我的社区反响非常好。那些 Reddit 的克隆网站根本不值一提。

我不确定是否理解 Solved 插件与这个问题的关联。它会影响置顶日期吗?

这也有其自身的问题:为了保持用户参与度,时间线必须采用无限滚动模式。我的大多数用户会直接离开,而不是进入各个分类浏览。

我想我接下来会在开发环境中进行实验,看看如果覆盖 bumped_at 会遇到哪些问题,并评估是否能接受这些权衡。我还没查看代码,但看起来“最后访问”标记可能会变得混乱,所以我必须抑制它。此外,我认为“新主题或已更新主题”的功能也会受到影响,因此可能也需要进行一些覆盖或抑制处理。

我会在本线程中分享我的经验,以防其他人也感兴趣。如果你们能立刻想到其他可能引发的问题,请告诉我。