2012-08-02 14 views
5

Ein Datum in der Datenbank sieht wie folgt aus: 2012-07-23Rails Datum Vergleich; Datum größer oder gleich Tagen

Ich versuche, um zu sehen, ob das Datum vor älter als 7 Tage ist und weniger als 14 Tagen oder sehen, ob das Datum größer ist vor 14 Tagen, aber ich bin kein Glück ..

Hier ist mein Code:

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

Verwenden Sie Rails? Ruby hat keine Tage-Methode. Sie brauchen ActiveSupport für diese – revolver

+0

ja Entschuldigung, ich habe vergessen, das in .. Ich verwende Rails 3 – dennismonsewicz

Antwort

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 

oder (weniger lesbar)

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 

Je nach Nutzung sollten Sie benannte Bereiche schaffen, sagen:

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

Dann Ihre Berufung Code etwas sein kann, wie

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

Ich endete damit, 'Time.now.to_date' zu ​​verwenden ... immer undefined Methode jetzt auf Datum erhalten. Aber das funktioniert wie ein Zauber !!! – dennismonsewicz

+1

Sicher. Das Datum ist auch etwas komisch, da es automatisch in Rails aufgenommen wird (also in der Rails-Konsole), aber nicht in Ruby, so dass Sie es nicht in der IRB-Eingabeaufforderung verwenden können (außer Sie fügen es ein). Das hat unzählige verwirrt. –

+1

Wenn Sie in einer Konsole spielen wollen, verwenden Sie immer 'rails c';) –

5

Die akzeptierte Antwort eine nicht definierte Methode auf dem Datum verwendet Klasse. Das ist richtig:

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