samples = 100.times.map { |n| { id: n, time: rand(10000).hours.ago } }
data = samples.group_by { |rec| rec[:time].to_date }.group_by { |d, _| d.at_beginning_of_month }.group_by { |m, _| m.at_beginning_of_year }
data.sort_by(&:first).each { |y, recs| puts "-#{y.year}"; recs.sort_by(&:first).each { |m, recs| puts " -#{m.strftime '%B'}"; recs.sort_by(&:first).each { |d, recs| puts " -#{d.day}"; recs.each { |rec| puts " id: #{rec[:id]}" } } } }
da salida:
-2015
-November
-13
id: 32
-16
id: 41
-19
id: 4
-20
id: 39
-21
id: 86
-December
-4
id: 68
-7
id: 35
-8
id: 98
-22
id: 10
-27
id: 77
-2016
-January
-10
id: 37
-19
id: 67
-31
id: 85
-February
-2
id: 78
-13
id: 89
-16
id: 75
-17
id: 36
id: 99
-22
id: 28
-March
-9
id: 7
-11
id: 66
-16
id: 59
-26
id: 18
-29
id: 8
-April
-2
id: 3
-8
id: 69
-9
id: 60
-11
id: 2
-12
id: 33
-15
id: 26
-17
id: 17
id: 46
-19
id: 13
-22
id: 12
-24
id: 64
-27
id: 50
-29
id: 14
-30
id: 43
-May
-25
id: 82
-26
id: 11
-June
-3
id: 72
-8
id: 92
-14
id: 25
-19
id: 15
-22
id: 95
-23
id: 56
-26
id: 80
-27
id: 87
-29
id: 19
-July
-1
id: 6
-2
id: 81
-3
id: 1
-6
id: 88
-7
id: 65
-15
id: 91
-17
id: 27
-20
id: 38
-26
id: 73
-August
-1
id: 0
-7
id: 30
-8
id: 79
-15
id: 9
-23
id: 24
-25
id: 21
-September
-1
id: 52
-7
id: 48
-9
id: 34
-10
id: 54
id: 55
-22
id: 70
-27
id: 23
-29
id: 94
-October
-2
id: 22
-7
id: 51
-23
id: 63
-24
id: 57
id: 62
-28
id: 58
id: 76
-29
id: 90
-31
id: 49
-November
-5
id: 5
id: 45
-6
id: 61
-9
id: 93
-12
id: 83
-13
id: 71
-16
id: 53
-17
id: 29
-21
id: 44
-23
id: 84
-December
-9
id: 31
-13
id: 16
-14
id: 47
-16
id: 42
-17
id: 20
id: 96
-18
id: 97
-19
id: 74
-23
id: 40