如何在rails blog上按日分组?

时间:2015-03-25 06:58:09

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

我是rails的新手,刚刚完成了Michael Hartl的教程。

我正在创建一个小博客作为我的第一个应用程序,我希望对所有主页博客文章进行排序并将它们分组。

例子:TODAY和今天的所有帖子......在昨天和昨天的帖子之下等等。

我看到有一个名为group_by的方法,但无法弄清楚如何实现它

有人可以帮忙吗? 看到很多人都在网上寻找这样的解决方案。

谢谢, 亚当

3 个答案:

答案 0 :(得分:1)

这个groupdate有一个很棒的宝石,试一试,下面的示例代码

Blog.group_by_day(:created_at)

https://github.com/ankane/groupdate

答案 1 :(得分:1)

您可以使用group_by

posts = posts.group_by{|post|
      case post.created_at
          when 0.days.ago..1.day.ago
            "Today"
          when 1.day.ago..2.days.ago
            "Yesterday"
          when 1.week.ago..2.weeks.ago
            "Last week"
          when 2.weeks.ago..3.weeks.ago
            "2 weeks ago"
          when 1.month.ago..2.months.ago
            "Last month"
          else
            "Older"
          end
}

修改

上面的代码会在视图中将您作为哈希返回

@posts = {"Older"=>[#<Contact id: 1, name: "sontya", email: "montya@mailinator.com", comments: "hi there", created_at: "2015-03-20 
16:46:52", updated_at: "2015-03-20 16:46:52">, #<Contact id: 2, name: "faruk", email: "faruk@dispostable.com", comments: "hi there", created_at:
"2015-03-23 18:17:05", updated_at: "2015-03-23 18:17:05">],   "Yesterday" => [#<Contact id: 1, name: "sontya", email:    
"montya@mailinator.com", comments: "hi there", created_at: "2015-03-20 16:46:52", updated_at: "2015-03-20 16:46:52">, #<Contact id: 2, name:
"faruk", email: "faruk@dispostable.com", comments: "hi there", created_at: "2015-03-23 18:17:05", updated_at: "2015-03-23 18:17:05">]}

与您的数据类似,然后 在视图中,循环遍历Hash

<% @posts.each do |k,v| %>
   <tr>
      <td><%=k%></td>
   </tr>
   <% v.each do |post| %>
      <tr>
         <td><%=post.name%></td>
      </tr>  
   <% end %>  
<% end %>

答案 2 :(得分:0)

我认为使用数据库级别组是不正确的,因为它通常与sum或count或类似的东西一起使用,如果你不使用任何适用于组的函数,你最终只会使用一个发布每个组,在你的情况下每天发一个帖子,我认为你应该只选择all并将它们分组到数组中并在视图中循环

posts = Post.some_home_page_query.order(:created_at)
@grouped_posts = posts.chunk{ |x| x.created_at.to_date }

# you can replace the block passed to chunk with whatever you
# see fit for your own case

在视图中你可以做这样的事情

- @grouped_posts.each |date, posts|
  = "Posts for #{date.some_formatting}"
  - posts.each do |post|
    = render post # or whatever you want