Попробуйте это:
require 'active_support/all'
today = Time.now #=> 2010-12-01 14:58:36 -0700
sunday = (today - today.wday.days).beginning_of_day #=> 2010-11-28 00:00:00 -0700
saturday = sunday + 6.days #=> 2010-12-04 00:00:00 -0700
sunday.wday #=> 0
saturday.wday #=> 6
sunday - 1.year #=> 2009-11-28 00:00:00 -0700
sunday.prev_year #=> 2009-11-28 00:00:00 -0700
saturday - 1.year #=> 2009-12-04 00:00:00 -0700
saturday.prev_year #=> 2009-12-04 00:00:00 -0700
Вы также можете определить неделю года для одного из двух дней, затем вычесть 365.days
ActiveSupport был на самом деле разделен на более тонкую гранулярность с Rails 3, поэтому вам не нужно загружать весь пакет, если вы этого не хотите. Я сделал это для простоты. Более подробная информация находится на странице Основные расширения ActiveSupport .
Или, вы можете получить jiggy при разборе строки:
require 'chronic'
Chronic.parse('1 year ago last sunday') #=> 2009-11-28 12:00:00 -0700
Chronic.parse('1 year ago next saturday') #=> 2009-12-04 12:00:00 -0700
Мне нравится Chronic, и для такого рода синтаксического анализа я думаю, что это правильное решение, потому что строка - это то, что вы создаете, а не пользователь, так что меньше шансов, что ваш код будет взорван непарсируемой строкой. Я не уверен, что из-за синтаксического анализа произошел скачок скорости, поэтому некоторые тесты могли бы быть в порядке, если бы анализ был в цикле.