ruby-on-rails ruby range date-range

ruby on rails - ¿Cómo hago un bucle en un intervalo de fechas en reversa?



ruby-on-rails range (2)

Tengo un intervalo de fechas en el que me gustaría poder hacer un ciclo inverso. Dé lo siguiente, ¿cómo lograría esto? Parece que el operador de Range estándar no está funcionando correctamente.

>> sd = Date.parse(''2010-03-01'') => Mon, 01 Mar 2010 >> ed = Date.parse(''2010-03-05'') => Fri, 05 Mar 2010 >> (sd..ed).to_a => [Mon, 01 Mar 2010, Tue, 02 Mar 2010, Wed, 03 Mar 2010, Thu, 04 Mar 2010, Fri, 05 Mar 2010] >> (ed..sd).to_a => []

Como puede ver, el operador de rango funciona correctamente desde el principio hasta el final, pero no desde el final hasta el inicio.


Intente arriba / abajo para:

irb(main):003:0> sd = Date.parse(''2010-03-01'') => #<Date: 4910513/2,0,2299161> irb(main):004:0> ed = Date.parse(''2010-03-15'') => #<Date: 4910541/2,0,2299161> irb(main):005:0> sd.upto(ed) { |date| puts date } 2010-03-01 2010-03-02 2010-03-03 2010-03-04 2010-03-05 2010-03-06 2010-03-07 2010-03-08 2010-03-09 2010-03-10 2010-03-11 2010-03-12 2010-03-13 2010-03-14 2010-03-15 => #<Date: 4910513/2,0,2299161> irb(main):006:0> ed.downto(sd) { |date| puts date } 2010-03-15 2010-03-14 2010-03-13 2010-03-12 2010-03-11 2010-03-10 2010-03-09 2010-03-08 2010-03-07 2010-03-06 2010-03-05 2010-03-04 2010-03-03 2010-03-02 2010-03-01 => #<Date: 4910541/2,0,2299161>


Por lo general, simplemente invierto la matriz resultante:

ruby-1.8.7-p72 > sd = Date.parse(''2010-03-01'') => Mon, 01 Mar 2010 ruby-1.8.7-p72 > ed = Date.parse(''2010-03-05'') => Fri, 05 Mar 2010 ruby-1.8.7-p72 > (sd..ed).to_a => [Mon, 01 Mar 2010, Tue, 02 Mar 2010, Wed, 03 Mar 2010, Thu, 04 Mar 2010, Fri, 05 Mar 2010] ruby-1.8.7-p72 > (sd..ed).to_a.reverse => [Fri, 05 Mar 2010, Thu, 04 Mar 2010, Wed, 03 Mar 2010, Tue, 02 Mar 2010, Mon, 01 Mar 2010]

Supongo que para hacer lo correcto cuando no sabes si la fecha de inicio será antes o después de la fecha de finalización, querrías algo como:

def date_range(sd, ed) sd < ed ? (sd..ed).to_a : (ed..sd).to_a.reverse end

Lo que le dará lo correcto de cualquier manera:

ruby-1.8.7-p72 > sd = Date.parse(''2010-03-01'') => Mon, 01 Mar 2010 ruby-1.8.7-p72 > ed = Date.parse(''2010-03-05'') => Fri, 05 Mar 2010 ruby-1.8.7-p72 > date_range(sd, ed) => [Mon, 01 Mar 2010, Tue, 02 Mar 2010, Wed, 03 Mar 2010, Thu, 04 Mar 2010, Fri, 05 Mar 2010] ruby-1.8.7-p72 > date_range(ed, sd) => [Fri, 05 Mar 2010, Thu, 04 Mar 2010, Wed, 03 Mar 2010, Tue, 02 Mar 2010, Mon, 01 Mar 2010]