如何从另一个同名模块中引用AR模型?

问题描述

| 我有一个名为
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