Rails: я хочу заглушить Time.now, но он не будет заглушен - PullRequest
1 голос
/ 01 ноября 2011

У меня есть такая область действия

  scope :old,   joins(:group).where("`users`.`created_at` <=
        DATE_SUB(?, INTERVAL `groups`.`check_minutes` MINUTE)", Time.now)

Я заглушка Time.now следующим образом

  Time.stub!(:now).and_return(Time.parse("1 JUL 2010"))

Я хочу, чтобы область действия old использовала эту заглушку Time.now, но она использует текущее время.

Полагаю, рельсы создают области при первой загрузке модели (например, при загрузке spec_helper.rb), поэтому после загрузки области мы заглушаем Time.now.Это правда?

Итак, я нашел два решения:

  1. Перезагрузить модель пользователя после заглушки Time.now и перед использованием scope
  2. Использовать обычный метод вместо заглушки какэто

У вас есть более элегантные решения?

1 Ответ

4 голосов
/ 01 ноября 2011

Наличие Time.now в простой области нежелательно, поскольку вы заявляете, что область настроена при загрузке класса модели, поэтому длительный процесс Rails может иметь область действия, полученную несколько часов или дней назад.Проблема с заглушкой является побочным эффектом этой нежелательной ситуации.

Я бы посоветовал вам переписать область видимости, используя lambda, так что Time.now всегда запрашивается.Это облегчит проблему с заглушкой и всегда получит последнюю версию Time.now.

scope :old,   lambda { joins(:group).where("`users`.`created_at` <=
        DATE_SUB(?, INTERVAL `groups`.`check_minutes` MINUTE)", Time.now) }

Я не большой поклонник лямбда-синтаксиса здесь, но он делает свою работу.

...