2012-08-02 140 views
5

一個日期在我的數據庫看起來是這樣的:2012-07-23Rails日期比較;日期大於或等於天前

我想看看,如果日期是早於7天前,小於14天前或看日期是更大超過14天,但我有沒有運氣..

這裏是我的代碼:

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

您是否在使用Rails? Ruby沒有天方法。你需要ActiveSupport – revolver 2012-08-02 01:46:31

+0

對不起,我忘了補充說,我正在使用Rails 3 – dennismonsewicz 2012-08-02 01:47:02

回答

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 

或(不易閱讀)

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 

根據您的使用,你可能要創建命名範圍,說:

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

然後調用代碼可以是這樣的

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

我最終不得不使用'Time.now.to_date' ...在Date上不斷得到'undefined method'..但是,它的功能就像一個魅力! – dennismonsewicz 2012-08-02 02:03:48

+1

當然。日期有點奇怪,因爲它自動包含在rails中(所以你可以在rails控制檯中看到它),但不是在ruby中,所以你不會在IRB提示符下使用(除非包含它)。這混淆了無數。 – 2012-08-02 02:15:48

+1

當你想在控制檯上玩,總是使用'rails c';) – 2012-08-02 03:20:52

5

接受的答案使用一個未定義的方法上的日期類。這是正確的:

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