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 age
mé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 dob
for 2004/2/28 e today
for 2014/2/28, age
será 2014 - 2004
ou 10
. Os carros alegóricos serão 0228
e 0229
. b4bday
será "0228" < "0229"
ou true
. Finalmente, vamos subtrair 1
a partir age
e 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 b4bday
linha é muito longa. O 2016
ano 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
👍🏼