Flere svar har foreslået at beregne/gemme årets dag og sortere på det, men dette alene vil ikke gøre meget godt, når du er tæt på slutningen af året og skal overveje folk med fødselsdag i begyndelsen af det næste år.
Jeg ville gå efter en løsning, hvor du beregner den fulde dato (år, måned, dag) for hver persons næste fødselsdag , så sorter på det. Du kan gøre dette i Ruby-kode eller ved at bruge en lagret procedure i databasen. Sidstnævnte vil være hurtigere, men vil gøre din app sværere at migrere til en anden db-platform senere.
Det ville være rimeligt kun at opdatere denne liste over kommende fødselsdage én gang om dagen, hvilket betyder, at du kan bruge en form for caching. Derfor er hastigheden af den nødvendige forespørgsel/kode mindre et problem, og noget som dette burde fungere fint, så længe du cachelagrer resultatet:
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)
Rediger :Fastsat til at fungere korrekt med skudår.