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;)。
答案 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)
请参阅原始帖子中的解决方案。 非常感谢所有公开的贡献者。