Если я что-то упустил, я не вижу ничего плохого в приведенном вами коде. Time.now будет оцениваться каждый раз, когда истекает? называется. Я бы, вероятно, сократил до:
def expiring?
self.enddate >= 1.day.from_now
end
Для именованной области вам нужно поместить ее в лямбду, чтобы она каждый раз оценивалась (это звучит как вопрос, который вы фактически задаете):
named_scope :expiring, lambda { {:conditions => ["enddate >= ?", 1.day.from_now ] } }