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

时间:2011-06-10 04:39:24

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

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

CORRECTION

原来只能在命令行中使用。当我将它应用于Promotion子模块时,它没有返回相同的模型列表。那么,不是更好的方式, 以非模糊的方式访问AR模型的方式是什么?我已经更新了上面的定义,以更好地说明我正在尝试做什么。

1 个答案:

答案 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