Recentemente, tive que implementar um recurso de pesquisa de data no Rails usando o redis.
problema:
Buscar os valores envolvia iterar cada data dentro do período de datas e somar os valores assim:
$redis.hmget "stats/client:#{id}", *keys(beg_p, end_p)
O livro que estava fazendo referência implementou * chaves assim:
def keys(beg_p, end_p)
keys = []
while beg_p <= end_p
keys << if block_given?
yield(beg_p.to_s(:number))
else
beg_p.to_s(:number)
end
beg_p += 1.day
end
keys
end
Entre no palco certo: Ruby’s Range Class para fornecer uma solução mais simples, mais expressiva e elegante.
(1..5).to_a
=> [1, 2, 3, 4, 5]
('a'..'e').to_a
=> ["a", "b", "c", "d", "e"]
start_date = Date.new(2014, 8, 30)
=> Sat, 30 Aug 2014
end_date = Date.new(2014, 9, 2)
=> Tue, 02 Sep 2014
((start_date)..(end_date)).to_a
=> [
[0] Sat, 30 Aug 2014,
[1] Sun, 31 Aug 2014,
[2] Mon, 01 Sep 2014,
[3] Tue, 02 Sep 2014
]
Minha implementação final para * keys:
def get_every_date(starting, ending)
starting = Date.parse(starting).to_s(:number)
ending = Date.parse(ending).to_s(:number)
((starting)...(ending)).to_a
end
Voila!