我有这样的范围
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。这是真的吗?
所以我找到了两个解决方案:
你有更优雅的解决方案吗?
答案 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语法的忠实粉丝,但它确实能够胜任。