0

我正在用 Rails 制作一个非常简单的论坛(更多的是为了体验而不是实际生产可用于生产的代码),我想知道如何实现一个通用功能。

在 topic_controller 的索引中,如果我执行以下操作,最新的主题将位于主题列表的顶部。

主题控制器.rb

def index

@topics = Topic.all.order("created_at DESC")

end

但是,我希望按他们最近的帖子排序主题。当用户创建一个新主题时,他们需要为该主题创建第一个帖子,所以如果我能弄清楚如何通过最近创建的帖子对主题进行排序,那么这将解决所有问题。例如,如果“昨天的主题”刚刚添加了新帖子,则昨天创建的主题(“昨天的主题”)可能仍会放置在今天创建的主题(“今天的主题”)之上。

在模型中,

Topic.rb
has_many :posts

Post.rb

belongs_to :topic

请注意,我确信在 Rails 中有一种方法可以做到这一点,但是我确信在数据库中进行排序会更快,我想知道是否有一种方法可以在数据库中进行排序。但是,如果您只知道 Rails 解决方案就可以了。

4

2 回答 2

2

将您的关联更新为

belongs_to :topic, touch: true

然后每个新帖子都会更新updated_at相关主题的。

引用Rails 指南

如果您将:touch选项设置为true,则每当保存或销毁此对象时,关联对象上的updated_atupdated_on时间戳将设置为当前时间。

于 2013-10-12T23:43:03.860 回答
0

由于主题似乎不太可编辑且大部分可读,因此将 touch: true 添加到帖子->主题关联会更容易。在这种情况下,rails 将在每个获得新帖子的主题上更改 updated_at。之后,只需使用 Topic.order(updated_at: :desc) 来获取最新消息 - 昨天的主题与今天的新鲜评论将领先于在这些评论之前发表的今天的主题。另一种方法 - 将帖子加入主题,按创建的最大帖子进行分组和排序。不过会慢一些。另外,不要忘记分页 - Topic.all 不是一件好事,可能你知道这一点,但以防万一

于 2020-03-07T03:47:45.907 回答