一尘不染

如何在Rails中创建“即将到来的生日”模块?

sql

我有一个表“ users”,其列为“ date_of_birth”(具有日,月,年的DATE格式)。在前端,我需要列出5个即将到来的生日。

花了很长时间尝试找出逻辑。.也没有运气就浏览了Google中的所有文章。

有什么建议如何在RoR中做到这一点?

谢谢!


阅读 169

收藏
2021-03-17

共1个答案

一尘不染

有几个答案建议计算/存储 一年中的某天 并对其进行排序,但是仅当您临近年末并且需要考虑到明年年初有生日的人时,仅凭这一点并不能带来多大的好处。

我将寻求一种解决方案,其中您计算每个人的 下一个生日
的完整日期(年,月,日),然后进行排序。您可以使用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年正常工作。

2021-03-17