我有一个(ar)类PressClipping,由标题和日期字段组成。
我必须这样显示:
2011年2月
TITLE1
标题2
...
2011年1月
......
执行此分组的最简单方法是什么?
答案 0 :(得分:6)
以下是一些Haml输出,显示了如何使用Enumerable#group_by
进行迭代:
- @clippings_by_date.group_by{|c| c.date.strftime "%Y %b" }.each do |date_str,cs|
%h2.date= date_str
%ul.clippings
- cs.each do |clipping|
%li <a href="...">#{clipping.title}</a>
这为您提供了一个哈希,其中每个键都是格式化的日期字符串,每个值都是该日期的剪辑数组。这假设是Ruby 1.9,其中Hashes以插入顺序保留和迭代。如果你在1.8.x以下,你需要做类似的事情:
- last_year_month = nil
- @clippings_by_date.each do |clipping|
- year_month = [ clipping.date.year, clipping.date.month ]
- if year_month != last_year_month
- last_year_month = year_month
%h2.date= clipping.date.strftime '%Y %b'
%p.clipping <a href="...>#{clipping.title}</a>
我想你可以像1.8一样利用1.8下的group_by
(现在只使用纯Ruby来解决问题):
by_yearmonth = @clippings_by_date.group_by{ |c| [c.date.year,c.date.month] }
by_yearmonth.keys.sort.each do |yearmonth|
clippings_this_month = by_yearmonth[yearmonth]
# Generate the month string just once and output it
clippings_this_month.each do |clipping|
# Output the clipping
end
end