我正在使用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
当我尝试&#34;使用&#34; /&#34;加载&#34; 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
(至少在#34}解决问题#34},但是否正确?也就是说,有没有办法在&#34;对&#34;中解决我的问题?和&#34; 表演&#34;方式(例如,在检索其他常量之前加载所有Class1
常量)?建议使用上面的代码吗?
奖金:这类问题有一个约定吗?如果是这样,它是什么?
答案 0 :(得分:1)
执行此操作的正确方法可能只有一个常量引用您正在寻找的数据。加倍定义会导致这样的问题,并且还会使您的代码难以阅读和理解。
如果没有一个真正令人信服的理由在两个地方拥有相同的常数 - 并且几乎从不存在 - 请不要定义CONSTANT_CLASS_2_B或CONSTANT_CLASS_1_A。如果您需要它们,请从其他模型中引用它们,如下所示:
Class2::CONSTANT_CLASS_2_A
Class1::CONSTANT_CLASS_1_B