2011-10-31 6 views
1

У меня есть такой объемRails: Я хочу незавершенную Time.now, но он не будет погасил в областях

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

I STUB Time.now следующего

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

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

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

Так что я нашел два решения:

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

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

+0

http://railscasts.com/episodes/276-testing-time-web-requests – apneadiving

ответ

4

Наличие 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) } 

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

+0

Спасибо! Я решил использовать 'def old ... end'. – petRUShka