如何按年份进行分组?

Posted

技术标签:

【中文标题】如何按年份进行分组?【英文标题】:How do I do a grouping by year? 【发布时间】:2010-03-23 07:43:14 【问题描述】:

我有一个带有名为 publish_date 的日期类型列的书籍模型。根据我的观点,我正在遍历这些书籍,并且我想按年份对书籍进行分组,这样我就有了每年的标题,并且当年出版的书籍列在年份标题下方。

因此,以“2010”开头,将列出 2010 年出版的所有书籍,然后在另一个标题“2009”下方列出 2009 年出版的所有书籍,依此类推。

<% @all_books.each do |book| %>
   <%=link_to book.title + ", (PDF, " + get_file_size(book.size) + ")" %>
<% end %>

通过 book.publish_date.strftime("%Y") 我可以获得年份,但我不知道如何按年份对条目进行分组。对此的任何帮助将不胜感激。

【问题讨论】:

+1 - 这个问题对很多人都有帮助。 【参考方案1】:

你可以使用group_by(见API)就像(我的头顶)

<% @all_books.group_by(&:year).each do |year, book| %>

   ...
<% end %>

【讨论】:

修复:块将接收两个变量(分组属性和对象数组)【参考方案2】:
def year
  self.created_at.strftime('%Y')
end

< % @all_books.group_by(&:year).each do |year, book| %>

Year < %= year %>
# render books here

< % end %>

怎么说?

【讨论】:

非常感谢 Webbisshh 的快速响应和简洁的解决方案 请记住,与使用 DateTime 类本身可以做的事情相比,这有点麻烦。【参考方案3】:

为方便起见,您可以使用group_by,但您的需求可以通过依赖DB 进行排序和each 循环得到更好的满足。这避免了客户端排序和分组哈希操作的成本。

控制器中的某处

@all_books = Book.all(:order => "publish_date DESC")

在你看来

<%year = nil
  @all_books.each do |book| 
    if year.nil? or year > book.publish_date.year 
      year = book.publish_date.year 
%>
      <h1> <%=year%><h1>
  <%end % >
  <%=link_to book.title + ", (PDF, " + get_file_size(book.size) + ")" %>
<%end %>

【讨论】:

【参考方案4】:

快速而肮脏的方法是简单地按年份分组并遍历这些:

@all_books.group_by  |b| b.created_at.year .each do |year, books|
  # All books for one year, so put heading here
  books.each do |book|
    # ...
  end
end

这需要在 Rails 应用程序中进行排序,因此您需要检索所有相关记录才能正确组织数据。要在服务器上进行排序,您可能需要引入一个 year 列并使其与 created_at 时间保持同步。

【讨论】:

以上是关于如何按年份进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

在python中按特定年份对数据进行分组

如何从连接列按年份分组

WordPress 查询:按年份 DESC 对帖子进行分组,然后在每个组中按月 ASC 发布帖子

如何按月份或年份计数和分组,月份为零

SQL: 一般情况按年分组,特殊年份按指定日期分组,SELECT语句怎么写?

如何将数据框从长转换为宽,索引中的值按年份分组?