Nella fase di test del gestionale che sto sviluppando in Rails mi sono imbattutto in un piccolo problema con le date. In particolare dovevo visualizzare le fatture divise per mese (da inizio mese a fine mese). Con la vecchia soluzione il mese di giugno non veniva visualizzato:
….
capodanno = “01/01/#{Time.now.year}”.to_time
@mesi = %w{1 2 3 4 5 6 7 8 9 10 11 12}
@array_mesi = []
@mesi.each_index do |i|
inizio = capodanno + (i.to_i).month+1.day
unless inizio > Time.now
fine = inizio.end_of_month+1.day
@array_mesi[i] = Fattura.find(:all, :conditions => [ “data > ? and data < ?”, inizio.to_time, fine.to_time], :order => ‘id DESC’)
end
end
….
In questo caso purtroppo la riga
inizio = capodanno + (i.to_i).month+1.day
falliva nel mese di giugno…restituiva 30 maggio invece che 1 giugno e quindi il mese veniva visto come 30 magggio < => 31 maggio. Questo è dovuto alla diversa durata dei mesi (30/31/28 ecc ecc).
Una soluzione più elegante (e che soprattutto funziona) è la seguente:
….
@mesi = %w{1 2 3 4 5 6 7 8 9 10 11 12}
@array_mesi = []
@mesi.each_index do |i|
inizio = “#{1 + i.to_i}/01/#{Time.now.year}”.to_time
unless inizio > Time.now
fine = inizio.end_of_month+1.day
@array_mesi[i] = Fattura.find(:all, :conditions => [ “data > ? and data < ?”, inizio.to_time, fine.to_time], :order => ‘id DESC’)
end
end
….
Con il codice:
inizio = “#{1 + i.to_i}/01/#{Time.now.year}”.to_time
sfrutto la variabile iteratore i (gestita automaticamente dal metodo each_index) per formare la stringa della data e la trasformo successivamente in un oggetto di tipo time (con il metodo speciale to_time).
Sicuramente ci sarà una versione ancora più elegante e breve ma questa è quella che mi è venuta in mente al volo…se avete suggerimenti fatemi sapere!