У меня есть метод в моей модели пользователя, чтобы рассчитать возраст пользователя и вернуть человеческую удобочитаемую строку. Мой пользователь может быть от 1 месяца и старше, поэтому возвращаемая строка отличается в зависимости от того, является ли человек «2 месяца» или «1 год» или «2 года и 3 месяца».Возрастной метод Ruby с датой рождения, включая месяцы
Я рассмотрел несколько сообщений SO, чтобы прийти к этому решению. Есть что-то, чего я не вижу? Високосные годы? Спасибо!
def age
dob = self.date_of_birth
# if a date of birth is not nil
if dob != nil
# get current date
now = Date.current
# has person had their birthday yet this year
had_birthday = ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? true : false)
# if yes then subtract this year from birthday year, if not then also subtract 1 to get how many full years old they are
years = now.year - dob.year - (had_birthday ? 0 : 1)
# get the calendar month difference from birthdya calendar month and today's calendar month. if they have not had their birthdya yet then subtract the difference from 12
months = had_birthday ? now.month - dob.month : 12 - (now.month - dob.month)
# for under 1 year olds
if years == 0
return months > 1 ? months.to_s + " months old" : months.to_s + " month old"
# for 1 year olds
elsif years == 1
return months > 1 ? years.to_s + " year and " + months.to_s + " months old" : years.to_s + " year and " + months.to_s + " month old"
# for older than 1
else
return months > 1 ? years.to_s + " years and " + months.to_s + " months old" : years.to_s + " years and " + months.to_s + " month old"
end
# No date of birth saved so can not calculate age
else
return "No Date of Birth"
end
end
"Есть что-нибудь не хватает?", Это exaclty, где вы хотите использовать модульные тесты, даже если вы в противном случае они не используются. Вы можете использовать их для обеспечения того, чтобы правильная вещь произошла, когда кто-то родился на первом марше, а сегодня 29 февраля. Чтобы упростить тестирование, сделайте «now/today» также параметром. – Meier