我如何按年分组?

时间:2010-03-23 07:43:14

标签: ruby-on-rails ruby model views

我有一个书籍模型,其日期类型列名为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”)我可以获得年份,但我不知道如何按年度对条目进行分组。任何有关这方面的帮助将不胜感激。

4 个答案:

答案 0 :(得分:6)

您可以使用group_by(请参阅API)(我的头顶

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

   ...
<% end %>

答案 1 :(得分:3)

def year
  self.created_at.strftime('%Y')
end

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

Year < %= year %>
# render books here

< % end %>

说什么?

答案 2 :(得分:2)

为方便起见,您可以使用group_by,但依靠数据库进行排序和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 %>

答案 3 :(得分:1)

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

@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应用程序中进行排序,因此您需要检索所有相关记录才能正确组织数据。要在服务器上进行排序,您可能需要引入年份列并使其与created_at时间保持同步。