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

Kas*_*nis 4 ruby mysql sql ruby-on-rails

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

花了很长时间试图弄清楚这个逻辑..还浏览了谷歌里所有可能没有运气的文章.

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

谢谢!

Lar*_*eth 8

有几个答案建议计算/存储一年中的日期并对其进行分类,但是当你接近年底并且需要在明年年初考虑有生日的人时,这一点并不会有多大好处.

我会找一个解决方案来计算每个人下一个生日的完整日期(年,月,日),然后对此进行排序.您可以在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)
Run Code Online (Sandbox Code Playgroud)

编辑:修复了与闰年一起正常工作.


cod*_*ted 5

感谢我在Rails 3应用程序中使用的这篇文章:

 u = User.where("strftime('%m%d', date_of_birth) = ?", Date.today.strftime('%m%d'))
Run Code Online (Sandbox Code Playgroud)

更新:

将此与Postgresql一起使用:

u = User.where("extract(month from date_of_birth) = ? AND extract(day from date_of_birth) = ?", Date.today.strftime('%m'), Date.today.strftime('%d'))
Run Code Online (Sandbox Code Playgroud)