group_by Month
Learn how to use the very useful group_by method to group an array by anything you want! In this episode I group an array of tasks by month then sort it properly.
学习如何使用group_by方法将一个数组按照你的意愿分组。这一节我会将任务按照月来分组然后适当的进行排列。
---
先来了解一下group_by方法:
>>script/console
>>a=(1..20).to_a
>>[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
>>a.group_by {|num| num/5}
=>{0=>[1,2,3,4],1=>[5,6,7,8],2=>[10,11,12,13,14],3=>[15,16,17,18,19],4=>[20]}
--回来原先那个例子中:
def index
@task_months=@tasks.group_by {|t| t.due_at.beginning_of_month}
end
在view中循环这个变量
<% @task_months.each do |month,tasks|%>
<h2><%= month.strftime('%B')%></h2>
<% for task in tasks%>
<%=task.name%>
due on<%= task.due_at.to_date.to_s(:long)%>
<%end%>
<%end%>
修改之后显示就是这样的了:
看到,虽然这是按着月这样排了,但是发现April,June,May不是按顺序的。
所以:
<% @task_months.keys.each do |month|%>
<h2><%= month.strftime('%B')%></h2>
<% for task in @task_months[month]%>
<%=task.name%>
due on<%= task.due_at.to_date.to_s(:long)%>
<%end%>
<%end%>
先对hash的key循环,然后内部对value循环。
本文转自 fsjoy1983 51CTO博客,原文链接:http://blog.51cto.com/fsjoy/131943,如需转载请自行联系原作者