2014-09-22 107 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