Няколко отговора предлагат изчисляване/съхранение на ден от годината и сортиране по това, но това само по себе си няма да ви помогне, когато сте близо до края на годината и трябва да вземете предвид хора с рождени дни в началото на следващата година.
Бих избрал решение, при което изчислявате пълната дата (година, месец, ден) на следващия рожден ден на всеки човек , след това сортирайте по това. Можете да направите това в Ruby код или с помощта на съхранена процедура в базата данни. Последният ще бъде по-бърз, но ще направи приложението ви по-трудно за мигриране към друга db платформа по-късно.
Би било разумно този списък с предстоящи рождени дни да се актуализира само веднъж на ден, което означава, че можете да използвате някаква форма на кеширане. Така скоростта на необходимата заявка/код е по-малко проблем и нещо подобно трябва да работи добре, стига да кеширате резултата:
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)
Редактиране :Поправено да работи правилно с високосни години.