Ok che dire di questo:
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
Ciò presuppone che stiamo utilizzando le rotaie, chiamando il age
metodo su un modello e che il modello abbia una colonna del database della data dob
. Questo è diverso dalle altre risposte perché questo metodo usa le stringhe per determinare se siamo prima del compleanno di quest'anno.
Ad esempio, se dob
è 2004/2/28 ed today
è 2014/2/28, age
sarà 2014 - 2004
o 10
. I galleggianti saranno 0228
e 0229
. b4bday
sarà "0228" < "0229"
o true
. Infine, si sottrae 1
da age
e ottenere 9
.
Questo sarebbe il modo normale di confrontare le due volte.
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
Funziona allo stesso modo, ma la b4bday
linea è troppo lunga. Anche l' 2016
anno non è necessario. Il confronto delle stringhe all'inizio era il risultato.
Puoi anche farlo
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 non stai usando le rotaie, prova questo
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
👍🏼