Ok những gì về điều này:
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
Điều này giả sử chúng ta đang sử dụng đường ray, gọi age
phương thức trên một mô hình và mô hình có một cột cơ sở dữ liệu ngày dob
. Điều này khác với các câu trả lời khác vì phương pháp này sử dụng các chuỗi để xác định xem chúng tôi có trước sinh nhật năm nay không.
Ví dụ: nếu dob
là 2004/2/28 và today
là 2014/2/28, age
sẽ là 2014 - 2004
hoặc 10
. Những chiếc phao sẽ 0228
và 0229
. b4bday
sẽ "0228" < "0229"
hoặc true
. Cuối cùng, chúng tôi sẽ trừ 1
từ age
và nhận được 9
.
Đây sẽ là cách bình thường để so sánh hai lần.
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
Điều này hoạt động như nhau, nhưng b4bday
dòng quá dài. Các 2016
năm cũng là không cần thiết. Việc so sánh chuỗi ở đầu là kết quả.
Bạn cũng có thể làm điều này
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
Nếu bạn không sử dụng đường ray, hãy thử điều này
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
👍🏼