Вот некоторые выходные данные 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, где хэши сохраняются и повторяются в порядке вставки. Если вы ниже 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>
Полагаю, вы могли бы воспользоваться преимуществом group_by
под 1,8, например, так (просто используя чистый 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