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 agemé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 dobes 2004/2/28 y todayes 2014/2/28, ageserá 2014 - 2004o 10. Las carrozas serán 0228y 0229. b4bdayserá "0228" < "0229"o true. Por último, vamos a restar 1de agey 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 b4bdaylínea es demasiado larga. El 2016añ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
👍🏼