2010-03-23 115 views
3

我有一个名为publish_date的日期类型列的书籍模型。根据我的看法,我正在反复阅读这些书籍,并且希望按照年份对书籍进行分组,以便每年都有一个标题,并在当年发布的书籍在年份标题下列出。如何按年份分组?

因此,从2010年开始,所有在2010年出版的书籍将被列出,然后在2009年出版的2009年出版的所有书籍的另一个标题“2009”等等。

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

做一个book.publish_date.strftime(“%Y”),我能够拿到一年,但我不知道如何按一年的条目。任何帮助,将不胜感激。

+0

+1 - 这个问题对许多人会有帮助。 – RubyDubee 2010-03-23 11:24:37

回答

2

可以使用group_by为了方便,但你的需求可以得到更好的通过依靠数据库进行排序和循环,避免了客户端排序和散列操作对分组的成本

在您的控制器

@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 %> 
+0

感谢KandadaBoggu为您的解决方案,像一个魅力 – 2010-03-23 11:14:35

6

您可以使用group_by(见API)喜欢(我的头顶

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

    ... 
<% end %> 
+0

修复:块会收到两个变量(分组属性和对象数组) – Eimantas 2010-03-23 07:54:04

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

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

Year < %= year %> 
# render books here 

< % end %> 

此话怎讲?

+0

感谢一群Webbissh为您的快速响应和一个整洁的解决方案 – 2010-03-23 11:13:47

+0

请记住,这是一个kludge相比,你可以用DateTime做什么课本身。 – tadman 2010-03-23 19:46:58

1

的快速和肮脏的方法是简单地GROUP_BY年和遍历这些:

@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时间保持同步。