Plusieurs réponses ont suggéré de calculer/stocker le jour de l'année et trier cela, mais cela seul ne servira pas à grand-chose lorsque vous approchez de la fin de l'année et que vous devez tenir compte des personnes dont l'anniversaire aura lieu au début de l'année prochaine.
J'opterais pour une solution où vous calculez la date complète (année, mois, jour) du prochain anniversaire de chaque personne , puis triez sur cela. Vous pouvez le faire dans le code Ruby ou en utilisant une procédure stockée dans la base de données. Ce dernier sera plus rapide, mais rendra plus difficile la migration de votre application vers une autre plate-forme de base de données ultérieurement.
Il serait raisonnable de mettre à jour cette liste des anniversaires à venir une fois par jour seulement, ce qui signifie que vous pouvez utiliser une certaine forme de mise en cache. Ainsi, la vitesse de la requête/du code nécessaire est moins un problème, et quelque chose comme ça devrait fonctionner correctement tant que vous cachez le résultat :
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)
Modifier :Correction pour fonctionner correctement avec les années bissextiles.