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