Verschillende antwoorden hebben voorgesteld om dag van het jaar te berekenen/op te slaan en daarop sorteren, maar dit alleen heeft niet veel zin als je het einde van het jaar nadert en rekening moet houden met mensen die begin volgend jaar jarig zijn.
Ik zou gaan voor een oplossing waarbij je de volledige datum (jaar, maand, dag) van de volgende verjaardag van elke persoon berekent , sorteer daar dan op. U kunt dit doen in Ruby-code of met behulp van een opgeslagen procedure in de database. Dit laatste is sneller, maar maakt het later moeilijker om uw app naar een ander db-platform te migreren.
Het zou redelijk zijn om deze lijst met aankomende verjaardagen slechts één keer per dag bij te werken, wat betekent dat je een vorm van caching kunt gebruiken. Dus de snelheid van de benodigde query/code is minder een probleem, en zoiets als dit zou prima moeten werken zolang je het resultaat in de cache plaatst:
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)
Bewerken :Vast om correct te werken met schrikkeljaren.