我有一个名为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
我想知道是否有更好的方法来解决这个问题?
CORRECTION
原来只能在命令行中使用。当我将它应用于Promotion子模块时,它没有返回相同的模型列表。那么,不是更好的方式, 以非模糊的方式访问AR模型的方式是什么?我已经更新了上面的定义,以更好地说明我正在尝试做什么。
答案 0 :(得分:4)
这是一个关于常量如何作用的问题。
简单的答案是
::Promotion
在你的例子中
class Promotion < ActiveRecord::Base; end
已在全球范围内定义了促销,因此可以通过3种方式访问
但在您的模块Faker::MyProject
中,对Promotion
的任何引用都会查找此命名空间
如果Faker::MyProject::Promotion
存在,则会返回此内容。
我建议你养成在这类案件中引用::Promotion
的习惯。
示例:
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