Here is the mysterious:
I have a scope which looks like this (in Image.rb)
scope :moderate_all, delegates.where("moderation_flag = #{$moderation_flags[:not_moderated]}")
Note that delegates is another scope that I am defining before moderate_all
When I leave it like this, I can run my test that checks if an image has been “checked-out” it is not available anymore. I don’t put the code of the test, because it does not matter actually.
With this code, when I run “rake test” it fails, but if I do “ruby test/unit/image_test.rb” it works! I was thinking I am starting to have a bad day. Then I tried
scope :moderate_all, lambda {
delegates.where("moderation_flag = #{$moderation_flags[:not_moderated]}")
}
And “rake test” passes!
So my problem is solved, but why?
$moderation_flags looks like a global, and the value of the named scope depends on it. My guess is that rake test loads the class before the global is ready, but invoking the test directly goes the other way.
Introducing the lambda causes the where clause to be evaluated when the scope is used, so it always happens late when the global is ready.