Pesquisa de data do Rails usando a classe Range do Ruby

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!