如何按年份进行分组?
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 时间保持同步。
【讨论】:
以上是关于如何按年份进行分组?的主要内容,如果未能解决你的问题,请参考以下文章
WordPress 查询:按年份 DESC 对帖子进行分组,然后在每个组中按月 ASC 发布帖子