根据子项的创建日期对对象进行排序

时间:2013-10-16 09:14:02

标签: ruby-on-rails ruby activerecord forum

我正在rails中创建一个基本论坛。我有一个有许多线程的论坛,而且线程有很多帖子。我想获得特定论坛的所有主题并以这样的方式对它们进行排序,即第一个是拥有最新帖子的主题。

在我的Post的存储库中,我有一个方法可以返回最新的帖子。

 def latest_post
    order('created_at DESC').limit(1).first
 end

在Threads类中,我有一个方法调用latest_post,它返回最新的帖子

 def latest_post
    self.posts.latest_post
 end

我以下列方式使用该方法以获取线程的最新帖子。

@some_thread.posts.latest_post

现在我想获得有序的线程列表。我试图在Thread类中添加一个默认范围,以便默认排序。

default_scope order('latest_post.created_at DESC')

这不起作用。我相信由于订购的latest_post部分不在数据库级别。

如何根据最新帖子的创建日期订购帖子。它不需要是默认排序。

2 个答案:

答案 0 :(得分:3)

试试这个:

 scope :latest_post_first , Thread.joins(:posts). # joins needed to access posts for each thread
                            # grouping enables the SQL MAX function 
                            # also returns unique threads
                            group("threads.id"). 
                            # order by maximum value of post's created_at in each group 
                            # i.e. each thread since grouping is by thread id
                            order("MAX(posts.created_at) DESC") 

请注意,这只会返回至少有一个帖子的帖子,所以我不建议将其作为默认范围。

答案 1 :(得分:0)

替代答案:

我在Thread表中添加了一个last_post_at列。创建新帖子时,它会更新此值。

然后我可以设置默认范围排序。

 default_scope order('last_post_at DESC')

优势:在为论坛创建有序的主题列表时,不需要加载所有帖子。 缺点:在Thread模型上维护另一列。