Visualizzare dati in base alla data…

4 Giu 2008
Categoria: Ruby on Rails

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!

Lascia un Commento

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word