基于其中一个实例对两组实例进行排序 - 视图 - Ruby on Rails

时间:2015-03-16 17:11:47

标签: ruby-on-rails ruby sorting ruby-on-rails-4

RoR App有帖子和类别,主视图是一组类别/帖子。它显示了每个类别的帖子(超过3天)。未显示空类别。

我想对索引视图进行排序,以便首先显示包含更多近期帖子的类别。因此,当为类别创建新帖子时,该类别会上升到第一个"行"该应用程序。在类别中,帖子也应该从较新到较旧。

因此,我需要实现两个级别的排序,最新帖子的类别先排序,帖子按类别中的创建日期排序。我真的被卡住了,你会怎么实现这个?

我的控制器:

def index
@categories = Category.includes(:posts).select{|c| c.posts.where(['created_at > ?', 3.days.ago]).count > 0} 
end

我的观点:

 <% @categories.each do |category| %>
  # show category name
     <% category.posts.where(['created_at > ?', 3.days.ago]).each do |post| %>
     # show post title and date
     <% end %>
  <% end %>

更新:显示我到目前为止所尝试的内容:

我试图先根据帖子排序@categories&#39; creation_date(如解释,类别has_many:帖子)。在我的控制器中:

@categories = Category.includes(:posts).order('posts.created_at').select{|c| c.posts.where(['created_at > ?', 3.days.ago]).count > 0} 

然后在我看来,在帖子加载时对帖子进行排序:

 <% @categories.each do |category| %>
  # show category name
     <% category.posts.order('created_at').where(['created_at > ?', 3.days.ago]).each do |post| %>
     # show post title and date
     <% end %>
  <% end %>

关于counter_cache sugestion;我理解它只是用于优化数据库调用,尽管不是绝对必要的。

解决方案:可以按照之前的UPDATE中的说明完成;但是在控制器中每订单(&#39; posts.created_at DESC&#39;)更改了订单(&#39; posts.created_at&#39;) ;以及在视图中按订单(&#39; created_at DESC&#39;)更改订单(&#39; created_at&#39;)

2 个答案:

答案 0 :(得分:1)

您可以尝试以下方法吗? (抱歉joins但会更快)

Category.joins(:posts)
        .select('categories.*')
        .group('categories.id')
        .where('posts.created_at > ?', 30.days.ago)
        .having('COUNT(posts.*) > 0')
        .order('posts.created_at DESC')

答案 1 :(得分:0)

请参阅原始帖子中的解决方案。 非常感谢所有公开的贡献者。