2012-08-02 143 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