Diverse risposte hanno suggerito di calcolare/memorizzare giorno dell'anno e ordinamento su quello, ma questo da solo non farà molto bene quando sei vicino alla fine dell'anno e devi considerare le persone con i compleanni all'inizio del prossimo anno.
Sceglierei una soluzione in cui calcoli la data completa (anno, mese, giorno) del prossimo compleanno di ogni persona , quindi ordina su quello. Puoi farlo nel codice Ruby o usando una procedura memorizzata nel database. Quest'ultimo sarà più veloce, ma renderà più difficile la migrazione della tua app a una piattaforma db diversa in un secondo momento.
Sarebbe ragionevole aggiornare questo elenco di compleanni imminenti solo una volta al giorno, il che significa che puoi utilizzare una qualche forma di memorizzazione nella cache. Pertanto, la velocità della query/codice necessaria è meno problematica e qualcosa del genere dovrebbe funzionare correttamente finché si memorizza nella cache il risultato:
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)
Modifica :corretto per funzionare correttamente con gli anni bisestili.