Několik odpovědí navrhlo vypočítat/uložit den v roce a třídění podle toho, ale toto samo o sobě moc nepomůže, když se blíží konec roku a potřebujete vzít v úvahu lidi s narozeninami na začátku příštího roku.
Vybral bych řešení, kde vypočítáte celé datum (rok, měsíc, den) příštích narozenin každé osoby , pak podle toho seřaď. Můžete to udělat v kódu Ruby nebo pomocí uložené procedury v databázi. Druhá možnost bude rychlejší, ale později bude obtížnější migrovat vaši aplikaci na jinou platformu db.
Bylo by rozumné aktualizovat tento seznam nadcházejících narozenin pouze jednou denně, což znamená, že můžete použít nějakou formu ukládání do mezipaměti. Rychlost potřebného dotazu/kódu je tedy menší problém a něco takového by mělo fungovat dobře, pokud výsledek uložíte do mezipaměti:
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)
Upravit :Opraveno, aby správně fungovalo s přestupnými roky.