Rails:我想存根Time.now但它不会在范围中存根

时间:2011-10-31 22:28:11

标签: ruby-on-rails time scope stub

我有这样的范围

  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,但它使用当前时间。

我认为rails第一次加载模型时会创建范围(例如加载spec_helper.rb时),因此我们在加载范围后存根Time.now。这是真的吗?

所以我找到了两个解决方案:

  1. 在存根Time.now之后和使用范围之前重新加载用户模型
  2. 使用常规方法代替这样的存根
  3. 你有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分: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) }

我不是这里lambda语法的忠实粉丝,但它确实能够胜任。