таинственная разница между граблями и рубином - PullRequest
0 голосов
/ 24 декабря 2010

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

У меня есть область, которая выглядит следующим образом (в 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 ]

1 голос
/ 24 декабря 2010

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

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

0 голосов
/ 24 декабря 2010

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

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

...