这是神秘的:
我有一个看起来像这样的范围(在Image.rb中)
scope :moderate_all, delegates.where("moderation_flag = #{$moderation_flags[:not_moderated]}")
请注意,委托是我在moderate_all
之前定义的另一个范围当我这样离开时,我可以运行我的测试,检查图像是否已“检出”,它不再可用。我没有把测试代码,因为它实际上并不重要。
使用此代码,当我运行“rake test”时它会失败,但如果我执行“ruby test / unit / image_test.rb”它就可以了!我以为我开始有一个糟糕的一天。然后我试了
scope :moderate_all, lambda {
delegates.where("moderation_flag = #{$moderation_flags[:not_moderated]}")
}
“rake test”通过了!
所以我的问题解决了,但为什么呢?
答案 0 :(得分:1)
$ moderation_flags看起来像一个全局的,命名范围的值取决于它。我的猜测是rake测试在全局准备好之前加载了类,但是直接调用测试则是另一种方式。
引入lambda会导致在使用范围时评估where子句,因此它总是在全局准备就绪时发生。
答案 1 :(得分:0)
如果您可以发布失败,那将有助于回答这个问题,但这就是我要说的,当您使用lambda来评估范围的条件时,它们会在运行时进行评估。因此,如果您的范围与使用Time.now
类似,那么这很重要。
我不确定为什么会失败,但如果您发布更多信息,我会尝试提供更多帮助。