Ok co z tym:
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
Zakładamy, że używamy railsów, wywołując age
metodę na modelu, a model ma kolumnę bazy danych z datami dob
. Różni się to od innych odpowiedzi, ponieważ ta metoda wykorzystuje ciągi znaków do określenia, czy jesteśmy przed tegorocznymi urodzinami.
Na przykład, jeśli dob
to 2004/2/28, a today
to 2014/2/28, age
to będzie 2014 - 2004
lub 10
. Pływaki będą 0228
i 0229
. b4bday
będzie "0228" < "0229"
lub true
. Na koniec odejmiemy 1
od age
i otrzymamy 9
.
Byłby to normalny sposób porównania dwóch razy.
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
Działa to tak samo, ale b4bday
linia jest za długa. 2016
Roku jest również konieczne. Rezultatem było porównanie ciągów na początku.
Ty też możesz to zrobić
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
Jeśli nie używasz szyn, spróbuj tego
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
👍🏼