Проблема с утверждениями постоянного порядка - PullRequest
1 голос
/ 22 февраля 2012

Я использую Ruby on Rails 3.1, и я хотел бы понять, как правильно решить следующую проблему при указании констант.

У меня есть 2 класса:

class Class1 < ActiveRecord::Base
  CONSTANT_CLASS_1_A = Class2::CONSTANT_CLASS_2_A # => 222
  CONSTANT_CLASS_1_B = 111
end

class Class2 < ActiveRecord::Base
  CONSTANT_CLASS_2_A = 222
  CONSTANT_CLASS_2_B = Class1::CONSTANT_CLASS_1_B # => 111
end

Когда я пытаюсь «использовать» / «загрузить» Class1, я получаю следующую ошибку:

NameError in ...
uninitialized constant Class1::CONSTANT_CLASS_2_B

Однако, если я укажу приведенный ниже код (обратите внимание на порядок констант), он будет работать:

class Class1 < ActiveRecord::Base
  CONSTANT_CLASS_1_B = 1
  CONSTANT_CLASS_1_A = CONSTANT_CLASS_2_A * CONSTANT_CLASS_3_B # => 3
end

Я знаю, что могу указать CONSTANT_CLASS_1_B перед CONSTANT_CLASS_1_B (по крайней мере, чтобы "решить" проблему в настоящее время), но это правильно? То есть, есть ли способ решить мою проблему «правильным» и « перманентным » способом (например, загрузкой всех Class1 констант перед извлечением других констант) ? Желательно ли использовать вышеуказанный код?

Бонус : Существует соглашение для такого рода вопросов? Если так, что это?

1 Ответ

1 голос
/ 22 февраля 2012

Правильный способ сделать это, вероятно, иметь только одну константу, ссылающуюся на данные, которые вы ищете. Удвоение определений приводит к подобным проблемам и дополнительно усложняет чтение и понимание кода.

Если нет действительно веской причины иметь одну и ту же константу в двух местах - и почти никогда не бывает - не определяйте CONSTANT_CLASS_2_B или CONSTANT_CLASS_1_A. Если вы хотите их, обратитесь к ним из другой модели следующим образом:

Class2::CONSTANT_CLASS_2_A
Class1::CONSTANT_CLASS_1_B
...