我正在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部分不在数据库级别。
如何根据最新帖子的创建日期订购帖子。它不需要是默认排序。
答案 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模型上维护另一列。