如何从另一个同名模块中引用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
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...