2012-08-02 36 views
5

Một ngày trong cơ sở dữ liệu của tôi trông giống như sau: 2012-07-23So sánh ngày của Rails; ngày lớn hơn hoặc bằng ngày trước

Tôi đang cố gắng xem ngày đó có lớn hơn 7 ngày trước và chưa đầy 14 ngày trước hoặc xem ngày đó có lớn hơn không hơn 14 ngày trước, nhưng đang gặp không may mắn ..

đây là mã của tôi:

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

Bạn đang sử dụng Rails? Ruby không có phương pháp ngày. Bạn cần ActiveSupport cho rằng – revolver

+0

có xin lỗi, tôi quên để thêm rằng trong .. Tôi đang sử dụng Rails 3 – dennismonsewicz

Trả lời

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 

hoặc (ít có thể đọc được)

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 

Tùy thuộc vào cách sử dụng của bạn, bạn có thể muốn tạo tên phạm vi, nói:

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

Sau đó, mã gọi của bạn có thể là một cái gì như

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

Tôi đã kết thúc phải sử dụng 'Time.now.to_date' ... tiếp tục nhận' phương thức undefined now' vào Date .. nhưng nó hoạt động như một sự quyến rũ !!! – dennismonsewicz

+1

Chắc chắn. Ngày hơi lạ một chút vì nó tự động được bao gồm trong đường ray (vì vậy bạn nhìn thấy nó trong bảng điều khiển đường ray) nhưng không có trong ruby ​​nên bạn không được sử dụng trong lời nhắc IRB (trừ khi bạn đưa nó vào). Điều đó đã nhầm lẫn vô số. –

+1

Khi bạn muốn chơi trong bảng điều khiển, hãy luôn sử dụng 'đường ray c';) –

5

Câu trả lời được chấp nhận sử dụng một phương pháp xác định vào Ngày lớp học. Điều này đúng:

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