sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo crear el módulo Próximos cumpleaños en Rails?

Varias respuestas han sugerido calcular/almacenar día del año y ordenar eso, pero esto por sí solo no servirá de mucho cuando esté cerca de fin de año y necesite considerar a las personas que cumplen años a principios del próximo año.

Buscaría una solución en la que calcule la fecha completa (año, mes, día) del próximo cumpleaños de cada persona. , luego ordenar eso. Puede hacer esto en código Ruby o usando un procedimiento almacenado en la base de datos. Este último será más rápido, pero hará que su aplicación sea más difícil de migrar a una plataforma de base de datos diferente más adelante.

Sería razonable actualizar esta lista de próximos cumpleaños solo una vez al día, lo que significa que puede usar alguna forma de almacenamiento en caché. Por lo tanto, la velocidad de la consulta/código necesaria es un problema menor, y algo como esto debería funcionar bien siempre que almacene en caché el resultado:

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)

Editar :Corregido para que funcione correctamente con años bisiestos.