-1

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

在这里您可以看到我的代码,其中仅选择了 patient.birthday 小于或等于最大年龄的患者。

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 岁)

用户输入最大值 => 18

此用户未显示在列表中,但应显示他。我知道我必须改变我的def year,但我不知道怎么做!也许你可以帮助我谢谢!

更新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'
4

2 回答 2

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 对一个类似的问题做了很好的参考,这也是很好的注意事项,因此请结合我的答案使用。基本上他说闰年会导致这种代码崩溃。避免闰年崩溃的一个简短解决方法是以这种方式重写该方法:

def min_birthdate_for_age( age )
  a = Date.tomorrow
  a.ago( ( age + 1 ).years )
end
于 2013-09-14T19:35:08.083 回答
1

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

18.years.ago

哪个,在上下文中,会给你:

patients = patients.where("birthday >= ?", maximal.years.ago) if maximal.present?
于 2013-09-14T20:08:29.877 回答