Данные
Нам дан массив экземпляров класса Order
:
require 'date'
class Order
attr_reader :id, :date
def initialize(id,date)
@id = id
@date = date
end
end
arr = ['2019-10-07', '2019-10-08', '2019-10-10', '2019-10-10', '2019-10-12'].
map.each.with_index(1) { |s,i| Order.new(i, Date.iso8601(s)) }
#=> [#<Order:0x00005a49d68ad8b8 @id=1,
# @date=#<Date: 2019-10-07 ((2458764j,0s,0n),+0s,2299161j)>>,
# #<Order:0x00005a49d68ad6d8 @id=2,
# @date=#<Date: 2019-10-08 ((2458765j,0s,0n),+0s,2299161j)>>,
# #<Order:0x00005a49d68ad3b8 @id=3,
# @date=#<Date: 2019-10-10 ((2458767j,0s,0n),+0s,2299161j)>>,
# #<Order:0x00005a49d68ad138 @id=4,
# @date=#<Date: 2019-10-10 ((2458767j,0s,0n),+0s,2299161j)>>,
# #<Order:0x00005a49d68aceb8 @id=5,
# @date=#<Date: 2019-10-12 ((2458769j,0s,0n),+0s,2299161j)>>]
и даты начала и окончания:
start_date = '2019-10-05'
end_date = '2019-10-13'
Предположение
Я предполагаю, что:
Date.iso8601(start_date) <= arr.first.date &&
arr.first.date <= arr.last.date &&
arr.last.date <= Date.iso8601(end_date)
#=> true
Нет необходимости сортировать элементы arr
по дате.
Код
h = (start_date..end_date).each_with_object({}) { |d,h| h[d] = d + ':' }
arr.each do |inst|
date = inst.date.strftime('%Y-%m-%d')
h[date] += "#{h[date][-1] == ':' ? '' : ','} id #{inst.id}"
end
h.values
#=> ["2019-10-05:",
# "2019-10-06:",
# "2019-10-07: id 1",
# "2019-10-08: id 2",
# "2019-10-09:",
# "2019-10-10: id 3, id 4",
# "2019-10-11:",
# "2019-10-12: id 5",
# "2019-10-13:"]
Пояснение
Первый шаг - создание хеша h
:
h = (start_date..end_date).each_with_object({}) { |d,h| h[d] = d + ':' }
#=> {"2019-10-05"=>"2019-10-05:", "2019-10-06"=>"2019-10-06:",
# "2019-10-07"=>"2019-10-07:", "2019-10-08"=>"2019-10-08:",
# "2019-10-09"=>"2019-10-09:", "2019-10-10"=>"2019-10-10:",
# "2019-10-11"=>"2019-10-11:", "2019-10-12"=>"2019-10-12:",
# "2019-10-13"=>"2019-10-13:"}
Теперь мы пройдемся по элементам inst
(экземпляры Order
) из arr
, и для каждого из них будет изменено значение ключа в h
, равное inst.date
, преобразованному в строку:
arr.each do |inst|
date = inst.date.strftime('%Y-%m-%d')
h[date] += "#{h[date][-1] == ':' ? '' : ','} id #{inst.id}"
end
В результате:
h #=> {"2019-10-05"=>"2019-10-05:",
# "2019-10-06"=>"2019-10-06:",
# "2019-10-07"=>"2019-10-07: id 1",
# "2019-10-08"=>"2019-10-08: id 2",
# "2019-10-09"=>"2019-10-09:",
# "2019-10-10"=>"2019-10-10: id 3, id 4",
# "2019-10-11"=>"2019-10-11:",
# "2019-10-12"=>"2019-10-12: id 5",
# "2019-10-13"=>"2019-10-13:"}
Осталось только извлечь значения хеша h
:
h.values
#=> ["2019-10-05:",
# "2019-10-06:",
# "2019-10-07: id 1",
# "2019-10-08: id 2",
# "2019-10-09:",
# "2019-10-10: id 3, id 4",
# "2019-10-11:",
# "2019-10-12: id 5",
# "2019-10-13:"]