Ok, ¿qué pasa con esto?
def age
return unless dob
t = Date.today
age = t.year - dob.year
b4bday = t.strftime('%m%d') < dob.strftime('%m%d')
age - (b4bday ? 1 : 0)
end
Esto supone que estamos usando rieles, llamando al age
método en un modelo, y el modelo tiene una columna de base de datos de fechas dob
. Esto es diferente de otras respuestas porque este método usa cadenas para determinar si estamos antes del cumpleaños de este año.
Por ejemplo, si dob
es 2004/2/28 y today
es 2014/2/28, age
será 2014 - 2004
o 10
. Las carrozas serán 0228
y 0229
. b4bday
será "0228" < "0229"
o true
. Por último, vamos a restar 1
de age
y obtener 9
.
Esta sería la forma normal de comparar las dos veces.
def age
return unless dob
t = Date.today
age = today.year - dob.year
b4bday = Date.new(2016, t.month, t.day) < Date.new(2016, dob.month, dob.day)
age - (b4bday ? 1 : 0)
end
Esto funciona igual, pero la b4bday
línea es demasiado larga. El 2016
año también es innecesario. La comparación de cadenas al principio fue el resultado.
También puedes hacer esto
Date::DATE_FORMATS[:md] = '%m%d'
def age
return unless dob
t = Date.today
age = t.year - dob.year
b4bday = t.to_s(:md) < dob.to_s(:md)
age - (b4bday ? 1 : 0)
end
Si no estás usando rieles, prueba esto
def age(dob)
t = Time.now
age = t.year - dob.year
b4bday = t.strftime('%m%d') < dob.strftime('%m%d')
age - (b4bday ? 1 : 0)
end
👍🏼