Таинственная разница между граблями и рубином

Вот таинственное:

У меня есть область, которая выглядит так (в Image.rb)

  scope :moderate_all, delegates.where("moderation_flag = #{$moderation_flags[:not_moderated]}")

Обратите внимание, что делегаты - это еще одна область, которую я определяю до

Когда я оставляю это так, я могу запустить свой тест, который проверяет, было ли изображение "извлечено", оно больше не доступно. Я не ставлю код теста, потому что на самом деле это не имеет значения.

С этим кодом, когда я запускаю "rake test", он терпит неудачу, но если я делаю "ruby test / unit / image_test.rb", это работает! Я думал, у меня плохой день. Потом я попробовал

  scope :moderate_all, lambda {
    delegates.where("moderation_flag = #{$moderation_flags[:not_moderated]}")
  }

И "тест на грабли" проходит!

Так что моя проблема решена, но почему?

2 ответа

Решение

$moderation_flags выглядит как глобальный, и от него зависит значение именованной области видимости. Я предполагаю, что тест rake загружает класс до того, как глобальный будет готов, но вызов теста напрямую идет другим путем.

Введение лямбды приводит к тому, что предложение where оценивается при использовании области действия, поэтому всегда происходит поздно, когда глобальный элемент готов.

Если бы вы могли опубликовать сообщение об ошибке, это помогло бы ответить на этот вопрос, но это то, что я скажу, когда вы используете лямбду для оценки условий для области, они оцениваются во время выполнения. Так что это важно, если ваша сфера использует что-то вроде использования Time.now,

Я не уверен, почему это не удается, но если вы опубликуете немного больше информации, я постараюсь быть более полезным.

Другие вопросы по тегам