Вы говорите, что хотите группировать по тому, насколько они близки друг к другу.Вы хотите сгруппировать по подмножеству значения #created_at, таким образом:
require "rubygems"
require "active_support/core_ext/array"
require "ostruct"
require "pp"
o1 = OpenStruct.new(:created_at => Time.local(2010, 11, 24, 20, 1, 0, 0))
o2 = OpenStruct.new(:created_at => Time.local(2010, 11, 24, 20, 2, 0, 0))
o3 = OpenStruct.new(:created_at => Time.local(2010, 11, 24, 20, 6, 0, 0))
o4 = OpenStruct.new(:created_at => Time.local(2010, 11, 24, 20, 13, 0, 0))
a = [o1, o2, o3, o4]
grouped = a.group_by do |obj|
time = obj.created_at
Time.local(time.year, time.month, time.day, time.hour, (time.min / 5).floor, 0)
end
pp grouped.map {|val, arr| [val, arr.map {|obj| obj.created_at.to_s }] }
, который возвращает:
$ ruby a.rb
[[Wed Nov 24 20:02:00 -0500 2010, ["Wed Nov 24 20:13:00 -0500 2010"]],
[Wed Nov 24 20:00:00 -0500 2010,
["Wed Nov 24 20:01:00 -0500 2010", "Wed Nov 24 20:02:00 -0500 2010"]],
[Wed Nov 24 20:01:00 -0500 2010, ["Wed Nov 24 20:06:00 -0500 2010"]]]
Первое значение каждого вложенного массива является ключом (минутав группах по 5 минут), а значения являются фактическими объектами ActiveRecord.Для удобства чтения я сопоставил строковую версию Time, но это та же идея.
Также помните, что #group_by генерирует Array, упорядоченный так же, как исходный Array, таким образом, ваши ограничения порядка сохраняются - выне нужно прибегать к массиву.