Date.today减去18年Ruby

时间:2013-09-14 19:11:21

标签: ruby-on-rails ruby ruby-on-rails-3

在我的rails应用程序中,用户可以搜索患者,并选择患者应该最大的年龄!

在这里,您可以看到我的代码,其中只选择患者生育日较小或等于最大年龄的患者。

patients = patients.where("birthday >= ?", year(maximal)) if maximal.present?

用户在年龄中键入例如15作为最大值,因此我必须将输入转换为日期:

def year(maximal)
  a = Date.today
  year = a.year - maximal
  month = a.mon
  day = a.mday
  Date.new(year,month,day)
end 

现在我的问题:如果我有例如:

Patient.birthday => 29.09.1994 (意思是18岁)

maximal =>的用户输入18

虽然应该显示该用户,但该列表中未显示该用户。我知道我必须改变我的def年,但我不知道怎么做!也许你可以帮我谢谢!

UPDATEUPDATEUPDATEUPDATEUPDATEUPDATEUPDATEUPDATEUPDATEUPDATEUPDATEUPDATE

好的我的新代码:

patients = patients.where("#{age(:birthday)} >= ?", maximum) if maximum.present?

def age(dobss)
 dob = Date.new(dobss)
 now = Time.now.utc.to_date
 now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
end 

但现在我收到了错误:

  comparison of Symbol with 0 failed 
 app/models/search.rb:28:in `<'
 app/models/search.rb:28:in `new'
 app/models/search.rb:28:in `age'

2 个答案:

答案 0 :(得分:1)

尝试使用相同的代码:

def year(maximal)
  a = Date.tomorrow
  year = ( a.year - maximal ) - 1
  month = a.mon
  day = a.mday
  Date.new(year,month,day)
end

请注意,主要更改是引用tomorrow而不是today,并将年份再降低一年。通过这样做,你把生日推到了第18年的最后一天。

year方法现在为您提供该年龄段的所有人。您只需将方法的名称重新定义为min_birthdate_for_age( age )。但是现在如果您想使用此方法查找至少达到该年龄的人,请相应地更改搜索:而不是搜索当天或之后出生的人,即>=,将其更改为较早的日期,即<

@MattJohnson对similar question提出了一个很好的参考,这也是很好的注意,所以请结合我的回答。基本上他说闰年会导致这种代码崩溃。避免闰年崩溃的简短解决方法是以这种方式重写方法:

def min_birthdate_for_age( age )
  a = Date.tomorrow
  a.ago( ( age + 1 ).years )
end

答案 1 :(得分:1)

看起来你试图获取一定年限的日期,在这种情况下你应该使用Rails提供的yearsago方法:

18.years.ago

在上下文中,它会给你:

patients = patients.where("birthday >= ?", maximal.years.ago) if maximal.present?