对常量订单语句的麻烦

时间:2012-02-22 19:38:06

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 constants

我正在使用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常量)?建议使用上面的代码吗?

奖金:这类问题有一个约定吗?如果是这样,它是什么?

1 个答案:

答案 0 :(得分:1)

执行此操作的正确方法可能只有一个常量引用您正在寻找的数据。加倍定义会导致这样的问题,并且还会使您的代码难以阅读和理解。

如果没有一个真正令人信服的理由在两个地方拥有相同的常数 - 并且几乎从不存在 - 请不要定义CONSTANT_CLASS_2_B或CONSTANT_CLASS_1_A。如果您需要它们,请从其他模型中引用它们,如下所示:

Class2::CONSTANT_CLASS_2_A
Class1::CONSTANT_CLASS_1_B