在我的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'
答案 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)