いくつかの回答は、年の日の計算/保存を示唆しています。 それを並べ替えますが、年末が近づいていて、来年の初めに誕生日を迎える人を考慮する必要がある場合、これだけではあまり効果がありません。
各人の次の誕生日の完全な日付(年、月、日)を計算するソリューションを探します。 、それから並べ替えます。これは、Rubyコードで行うか、データベースのストアドプロシージャを使用して行うことができます。後者の方が高速ですが、後でアプリを別のデータベースプラットフォームに移行するのが難しくなります。
今後の誕生日のこのリストを1日1回だけ更新することは合理的です。つまり、何らかの形式のキャッシュを使用できます。したがって、必要なクエリ/コードの速度はそれほど問題ではなく、結果をキャッシュする限り、このようなものは正常に機能するはずです:
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)
編集 :うるう年で正しく機能するように修正されました。