【问题标题】: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 - 这个问题对很多人都有帮助。

标签: ruby-on-rails ruby model views


【解决方案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 时间保持同步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 2021-04-12
      • 2018-09-17
      相关资源
      最近更新 更多