Ok, e quanto a isso:
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
Isso pressupõe que estamos usando trilhos, chamando o agemétodo em um modelo, e o modelo possui uma coluna de banco de dados de datas dob. Isso é diferente de outras respostas, porque esse método usa cadeias para determinar se estamos antes do aniversário deste ano.
Por exemplo, se dobfor 2004/2/28 e todayfor 2014/2/28, ageserá 2014 - 2004ou 10. Os carros alegóricos serão 0228e 0229. b4bdayserá "0228" < "0229"ou true. Finalmente, vamos subtrair 1a partir agee obter 9.
Essa seria a maneira normal de comparar as duas vezes.
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
Isso funciona da mesma forma, mas a b4bdaylinha é muito longa. O 2016ano também é desnecessário. A comparação de strings no início foi o resultado.
Você também pode fazer isso
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
Se você não estiver usando trilhos, tente isso
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
👍🏼