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 agemetodę 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 dobto 2004/2/28, a todayto 2014/2/28, ageto będzie 2014 - 2004lub 10. Pływaki będą 0228i 0229. b4bdaybędzie "0228" < "0229"lub true. Na koniec odejmiemy 1od agei 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 b4bdaylinia jest za długa. 2016Roku 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
👍🏼