3

我正在创建一个在 Rails 中的基本论坛。我有一个有很多主题的论坛,并且主题有很多帖子。我想获取特定论坛的所有主题并以第一个是具有最新帖子的主题的方式对它们进行排序。

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

 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 部分不在数据库级别。

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

4

2 回答 2

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") 

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

于 2013-10-16T10:06:26.933 回答
0

Alternative answer:

I added a last_post_at column to the Thread table. When a new post is created it updates this value.

I was then able to set the default scope ordering.

 default_scope order('last_post_at DESC')

Advantage: Do not need to load all the posts when creating the ordered list of Threads for a forum. Disadvantage: Maintaining another column on the Thread model.

于 2013-10-16T10:12:44.410 回答