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