2012-08-02 12 views
5

Una data nel mio database aspetto: 2012-07-23Confronto delle date delle rotaie; Data maggiore o uguale a giorni fa

Sto cercando di vedere se la data è più vecchio di 7 giorni fa e meno di 14 giorni fa, o vedere se la data è maggiore di 14 giorni fa, ma sto avendo senza fortuna ..

Ecco il mio codice:

def progress_report_status_check(date) 
    progress_date = date.to_date 
    seven_days = 7.days.ago.to_date 
    fourteen_days = 14.days.ago.to_date 

    if seven_days > (progress_date - 7.days.ago.to_date) or (progress_date - 14.days.ago.to_date) < fourteen_days 
     "due" 
    elsif (progress_date - 14.days.ago.to_date) > fourteen_days 
     "overdue" 
    end 
    end 
+1

Stai utilizzando Rails? Ruby non ha il metodo dei giorni. Hai bisogno di ActiveSupport per questo – revolver

+0

sì, mi dispiace, ho dimenticato di aggiungere che in .. Sto usando Rails 3 – dennismonsewicz

risposta

5
def progress_report_status_check(progress_date) # Pass in a date 
    if (progress_date < Date.now-14.days) 
    "overdue" 
    elsif (progress_date < Date.now-7.days) 
    "due" 
    end 
end 

o (meno leggibile)

def progress_report_status_check(progress_date) # Pass in a date 
    (progress_date < Date.now-14.days) ? "overdue" : ((progress_date < Date.now-7.days) ? "due" : "") : "" 
    end 
end 

seconda dell'uso che si può decidere di creare ambiti di nome, dicono:

scope :overdue where(:progress_date < Date.now-14.days) 
scope :due where(:progress_date < Date.now-7.days) 

Allora il vostro codice chiamante può essere qualcosa di simile

def progress_report_status_check(progress_date) # Pass in a date 
    self.overdue? ? "overdue" : self.due? ? : "due" : "" 
    end 
end 
+0

Ho finito per dover usare 'Time.now.to_date' ... continuava a ottenere' metodo non definito ora 'su Data .. ma funziona come un fascino !!! – dennismonsewicz

+1

Sicuro. La data è un po 'strana anche perché è automaticamente inclusa nei binari (così lo vedi nella console di rails) ma non in ruby, quindi non puoi usarli nel prompt IRB (a meno che tu non lo includa). Ciò ha confuso innumerevoli. –

+1

Quando vuoi giocare in una console, usa sempre 'rails c';) –

5

La risposta accettata utilizza un metodo non definito alla Data classe. Questo è corretto:

def progress_report_status_check(progress_date) # Pass in a date 
    if (progress_date < (Date.today-14.days)) 
    "overdue" 
    elsif (progress_date < (Date.today-7.days)) 
    "due" 
    end 
end 
Problemi correlati