2013-10-16 97 views
3

我在rails中创建基本论坛。我有一个有很多主题的论坛,而主题有很多帖子。我想为特定的论坛获取所有主题,并以这样的方式订购它们,即第一个主题是拥有最新Post的主题。根据子女的创建日期对对象进行排序

在我发布的信息库中有一个方法会返回最新的帖子。

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

在线程类我有返回最新帖子

def latest_post 
    self.posts.latest_post 
end 

我用下面的方式方法,以获得最新的职位线程的方法调用latest_post。

@some_thread.posts.latest_post 

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

default_scope order('latest_post.created_at DESC') 

这没有奏效。我相信由于排序的latest_post部分不在数据库级别。

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

回答

0

替代解答:

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

我当时可以设置默认的作用域排序。

default_scope order('last_post_at DESC') 

优势:的一个论坛创建线程的有序列表时不需要加载所有的职位。 缺点:在线程模型上维护另一列。

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

注意,这可能仅仅返回线程的至少一个职位,所以我不推荐它设置为默认范围。

+0

感谢您的回复。这正是我所寻找的解决方案。我唯一关心的是效率。如果线程有很多帖子,这个方法是否会开始降速? – robinjohnobrien

+0

sql内部连接会减慢它需要检索的发布行数,在这种情况下,缓存或其他列是更好的选择。 – tihom

+0

好酷。非常感谢您的建议! – robinjohnobrien

相关问题