Beberapa jawaban menyarankan untuk menghitung/menyimpan hari dalam setahun dan memilah-milahnya, tetapi ini saja tidak akan banyak berguna ketika Anda mendekati akhir tahun dan perlu mempertimbangkan orang-orang yang berulang tahun di awal tahun depan.
Saya akan mencari solusi di mana Anda menghitung tanggal lengkap (tahun, bulan, hari) setiap ulang tahun berikutnya setiap orang , lalu urutkan itu. Anda dapat melakukan ini dalam kode Ruby, atau menggunakan prosedur tersimpan dalam database. Yang terakhir akan lebih cepat, tetapi akan membuat aplikasi Anda lebih sulit untuk dimigrasikan ke platform db yang berbeda nanti.
Masuk akal untuk memperbarui daftar ulang tahun yang akan datang ini hanya sekali per hari, yang berarti Anda dapat menggunakan beberapa bentuk caching. Dengan demikian, kecepatan kueri/kode yang dibutuhkan tidak terlalu menjadi masalah, dan sesuatu seperti ini akan berfungsi dengan baik selama Anda menyimpan hasil cache:
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)
Sunting :Tetap berfungsi dengan benar dengan tahun kabisat.