dennismonsewicz
dennismonsewicz

Reputation: 25552

Rails date comparison; date greater or equal to days ago

A date in my database looks like this: 2012-07-23

I am trying to see if the date is older than 7 days ago and less than 14 days ago or see if the date is greater than 14 days ago, but am having no luck..

Here is my 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

Upvotes: 10

Views: 19754

Answers (2)

kid_drew
kid_drew

Reputation: 4005

The accepted answer uses an undefined method on the Date class. This is correct:

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

Upvotes: 7

Michael Durrant
Michael Durrant

Reputation: 96614

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

or (less readable)

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

Depending on your usage you may want to create named scopes, say:

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

Then your calling code can be something like

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

Upvotes: 10

Related Questions