Добре, що з цим:
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
Це передбачається, що ми використовуємо рейки, викликаємо age
метод на моделі, а модель має стовпчик бази даних dob
. Це відрізняється від інших відповідей, оскільки цей метод використовує рядки, щоб визначити, чи є ми до цьогорічного дня народження.
Наприклад, якщо dob
це 2004/2/28 і today
є 2014/2/28, age
буде 2014 - 2004
або 10
. Поплавці будуть 0228
і 0229
. b4bday
буде "0228" < "0229"
або true
. Нарешті, ми будемо віднімати 1
з age
і отримати 9
.
Це було б нормальним способом порівняння двох разів.
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
Це працює так само, але b4bday
лінія занадто довга. 2016
Рік також НЕ потрібно. Порівняння рядків на початку було результатом.
Ви також можете це зробити
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
Якщо ви не використовуєте рейки, спробуйте це
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
👍🏼