按关联模型的created_at排序

时间:2013-10-12 23:33:07

标签: ruby-on-rails postgresql

我正在使用Rails创建一个非常简单的骨骼论坛(更多的是用于体验而不是实际生成生产就绪代码),我想知道如何实现一个共同的功能。

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

topics_controller.rb

def index

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

end

但是,我希望通过最近的帖子订购主题。当用户创建新主题时,他们需要为该主题创建第一篇文章,因此,如果我能够弄清楚如何通过最近创建的帖子来排序主题,那么这将解决所有问题。例如,昨天创建的主题(“昨天的主题”)可能仍然位于今天创建的主题('今日主题')之上,如果'昨天的主题'刚才添加了一个新帖子。

在模型中,

Topic.rb
has_many :posts

Post.rb

belongs_to :topic

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

2 个答案:

答案 0 :(得分:1)

将您的关联更新为

belongs_to :topic, :touch => true

每个新帖子都会更新主题的updated_at

  

:触摸

     

如果为true,则在保存或销毁此记录时将触摸关联的对象(设置为now的now_at / on属性)。如果指定符号,除了updated_at / on属性外,该属性将使用当前时间进行更新。

(见:http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/belongs_to

答案 1 :(得分:0)

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