我有一个表“ users”,其列为“ date_of_birth”(具有日,月,年的DATE格式)。在前端,我需要列出5个即将到来的生日。
花了很长时间尝试找出逻辑。.也没有运气就浏览了Google中的所有文章。
有什么建议如何在RoR中做到这一点?
谢谢!
有几个答案建议计算/存储 一年中的某天 并对其进行排序,但是仅当您临近年末并且需要考虑到明年年初有生日的人时,仅凭这一点并不能带来多大的好处。
我将寻求一种解决方案,其中您计算每个人的 下一个生日 的完整日期(年,月,日),然后进行排序。您可以使用Ruby代码或在数据库中使用存储过程来执行此操作。后者会更快,但是会使您的应用以后很难迁移到其他数据库平台。
每天只更新一次即将到来的生日列表是合理的,这意味着您可以使用某种形式的缓存。因此,所需查询/代码的速度不再是问题,只要您缓存结果,类似这样的方法就可以正常工作:
class User def next_birthday year = Date.today.year mmdd = date_of_birth.strftime('%m%d') year += 1 if mmdd < Date.today.strftime('%m%d') mmdd = '0301' if mmdd == '0229' && !Date.parse("#{year}0101").leap? return Date.parse("#{year}#{mmdd}") end end users = User.find(:all, :select => 'id, date_of_birth').sort_by(&:next_birthday).first(5)
编辑 :固定为correctly年正常工作。