2012-08-02 48 views
5

una fecha en mi base de datos se ve así: 2012-07-23Comparación de fechas de rieles; fecha mayor o igual que hace días

Estoy tratando de ver si la fecha es de hace más de 7 días y hace menos de 14 días o si la fecha es mayor hace más de 14 días, pero estoy teniendo ninguna suerte ..

Aquí está mi código:

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

¿Está utilizando Rails? Ruby no tiene el método de días. Es necesario para que ActiveSupport – revolver

+0

sí lo siento, se me olvidó añadir que en .. estoy usando Rails 3 – dennismonsewicz

Respuesta

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 

o (menos legible)

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 

Dependiendo de su uso es posible que desee crear ámbitos mencionados, dicen:

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

A continuación, el código de llamada puede ser algo como

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

terminé tener que usar 'Time.now.to_date' ... cuidado para conseguir método' now' sin definir en fecha .. .pero eso funciona como un encanto! – dennismonsewicz

+1

Claro. La fecha también es un poco rara, ya que se incluye automáticamente en los rieles (para que puedas verla en la consola de rieles) pero no en rubí, por lo que no puedes utilizarla en el indicador IRB (a menos que la incluyas). Eso ha confundido a innumerables. –

+1

Cuando quiera jugar en una consola, siempre use 'rails c';) –

5

La respuesta aceptada utiliza un método definido en la Fecha clase. Esto es correcto:

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 
Cuestiones relacionadas