Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como criar o módulo Próximos aniversários no Rails?


Várias respostas sugeriram calcular/armazenar dia do ano e classificar sobre isso, mas isso por si só não vai fazer muito bem quando você está perto do final do ano e precisa considerar as pessoas com aniversários no início do próximo ano.

Eu optaria por uma solução em que você calculasse a data completa (ano, mês, dia) do próximo aniversário de cada pessoa , então classifique sobre isso. Você pode fazer isso em código Ruby ou usando um procedimento armazenado no banco de dados. O último será mais rápido, mas tornará seu aplicativo mais difícil de migrar para uma plataforma de banco de dados diferente posteriormente.

Seria razoável atualizar esta lista de aniversários futuros apenas uma vez por dia, o que significa que você pode usar alguma forma de armazenamento em cache. Assim, a velocidade da consulta/código necessária é um problema menor, e algo assim deve funcionar bem, desde que você armazene o resultado em cache:
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 :Corrigido para funcionar corretamente com anos bissextos.