2014-09-22 103 views
1

我正在開發一個比賽包圍應用程序,需要將某些日期進行比較,以便將它們放置在其指定的年齡組中。我似乎無法弄清楚我會如何寫這樣的東西。根據出生日期計算出年齡組內的年齡和地點

6 - under = 2007-09-01 to present 
8 - under = 2005-09-01 to 2007-08-31 
10 - under = 2003-09-01 to 20050831 

會是這樣的嗎?有沒有更好的方法來比較日期彼此。

def age_group 
    if self.dob <= 20030901 
     "10" 
    elsif self.dob <= 20050901 
     "8" 
    else self.dob <= 20070901 
     "6" 
    end 
end 

謝謝

+0

爲什麼返回一個只包含一個Integer的字符串,當方法的名稱暗示返回的類型是Integer? – MrYoshiji 2014-09-22 20:38:49

+0

你好 - 我的答案是否爲你解決這個問題? – Anthony 2014-09-24 00:45:19

回答

3

你當然可以保持你的AGE_GROUP方法,沒有什麼不妥的地方。我只是調整它,像這樣:

def age_group 
    if self.dob <= 10.years.ago 
     "10" 
    elsif self.dob <= 8.years.ago 
     "8" 
    elsif self.dob <= 6.years.ago 
     "6" 
    end 
end 
+0

這不會按預期發揮功能。 10年前出生的人的出生日期將少於'6.years.ago',並且將被分類到6歲的類別中。 – 2014-09-22 20:42:14

+0

我猜這種方法會在10年的屋頂下同時帶來6.年和8年的類別? – 2014-09-22 20:47:23

+0

感謝趕上球員,我更新了代碼。 – Anthony 2014-09-22 21:02:32

0

如果你不喜歡這樣,你將不得不每年更新的出生的截止日期。你可以計算出年齡來代替,而從那裏:

def age 
    now = Time.now.utc.to_date 
    now.year - birthday.year - (birthday.to_date.change(:year => now.year) > now ? 1 : 0) 
end 

(以上來自Get person's age in Ruby

然後定義年齡組:

def age_group 
    if self.age <= 10 
    "10" 
    elsif ... 
etc. 
0

一個case聲明會爲這項工作做得很好,因爲它使用===進行比較。

require 'date' 

R10U = (Date.parse("2003-09-01")..Date.parse("2005-08-31")) 
R8U = (Date.parse("2005-09-01")..Date.parse("2007-08-31")) 
R6U = (Date.parse("2007-09-01")..Date.today) 

def age_group(dob) 
    case Date.parse(dob) 
    when R6U then "6 - under" 
    when R8U then "8 - under" 
    when R10U then "10 - under" 
    else raise ArgumentError, "dob = '#{dob}' is out-of-range" 
    end 
end 

age_group("2006-04-12") 
    #=> "8 - under" 
age_group("2004-11-15") 
    #=> "10 - under" 
age_group("2011-06-01") 
    #=> "6 - under" 
age_group("2002-04-30") 
    #=> ArgumentError: dob = '2002-04-30' is out-of-range 
age_group("2015-06-01") 
    #=> ArgumentError: dob = '2015-06-01' is out-of-range