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

标签 ruby ruby-on-rails-3

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

我想知道是否有更好的方法来解决这个问题?

更正

事实证明,这只能从命令行运行。当我将它应用于促销子模块时,它没有返回相同的模型列表。那么,以明确的方式访问 AR 模型的 方法是什么,而不是更好的方法?我更新了上面的定义以更好地说明我正在尝试做的事情。

最佳答案

这是一个常量如何限定范围的问题。

简单的答案是

::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

关于ruby - 如何从另一个同名模块中引用 AR 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6302036/

相关文章:

ruby - "__send__"和 "instance_variable_get/instance_variable_set"方法有什么区别?

mysql - 在mysql数据库中添加分钟并与Time.now进行比较

ruby-on-rails - 使用 foreach 函数从 csv 文件中读取数据

ruby - native Ruby 模块给出错误 "The specified module could not be found."这不是真的

javascript - Rails/jQuery/Modal forms - 缓存问题?有时他们只是停止工作

ruby-on-rails - 在现有的 Ruby on Rails 应用程序中创建博客

ruby-on-rails - Factory-girl 创建绕过我的模型验证

ruby - Bundle 找不到明确安装的 gem

ruby-on-rails - 如何在 Rails 3 中自定义 to_json 响应

windows - JRuby on Rails 无法与在 Windows Server 2008 上作为服务运行的 Tomcat 一起使用