Желание было сделать это без гигантского, явного метода и воспользоваться преимуществами методов функционального программирования. Мэтт Юэлл прислал мне простой способ выполнить группировку элементов, поступивших в течение одной минуты, с помощью инъекции.
def group?(current, last)
current.created_at - last.created_at < 1.minute
end
recent_statuses.inject([]) { |results, status|
next results << [status] if results.empty? # Can't compare first item.
results << group?(status, results.last.last) ? stat : [stat]
}
Это приведет к массиву сообщений о состоянии и массивам сообщений о состояниинапример,
[<#Status>, <#Status>, [<#Status>, <#Status>], <#Status>, [#<Status>, <#Status>], <#Status>]
И позволит вам проанализировать этот список с помощью чего-то вроде:
results.each do |result|
if result.class == Status
# format a single entry
else result.class == Array
# Enter the grouped formatting
end
end
Это, конечно, можно расширить многими способами, включая помещение нескольких логических групп в группу? ().Концептуально это то, что я искал.