问题描述
|
我有一个名为
Promotion
的模型。
class Promotion < ActiveRecord::Base;
FORMATS = [0,1]
end
我的应用程序的/ lib文件夹中的文件中还定义了另一个名为\'Promotion \'的子类。
module Faker
module MyProject
module Promotion
def format
# Need to access Promotion::FORMATS
end
end
end
end
我需要从其他模块中引用AR类中定义的常量。到目前为止,我唯一能够做到的方法就是使用
ActiveRecord::Base.descendants.detect{|model| model.name == \'Promotion\'}::FORMATS
我想知道是否有更好的方法可以解决此问题?
更正
原来,这仅在命令行中有效。当我将其应用于Promotion子模块时,它没有返回相同的模型列表。因此,除了更好的方法以外,还有什么以明确的方式访问AR模型的方法呢?我已经更新了上面的定义,以更好地说明我正在尝试做的事情。
解决方法
这是一个常量范围的问题。
简单的答案是
::Promotion
在你的例子中
class Promotion < ActiveRecord::Base; end
促销活动已在全球范围内定义,因此可以通过3种方式进行访问
晋升
::促销
对象::促销
但是在模块Faker::MyProject
中,任何对Promotion
的引用都将查找此命名空间
如果存在Faker::MyProject::Promotion
,则将其返回。
我建议您养成在这种情况下参考“ 9”的习惯。
例:
class A; end
module B; class A; end
A #=> A
::A #=> A
Object::A #=> A
B.module_eval(\"A\") #=> B::A
B.module_eval(\"::A\") #=> A