访问常量而不总是指定模块

时间:2015-09-02 16:35:39

标签: ruby

我有一个包含几个常量的模块:

[My::Very::Long::Module::Name::FIRST_CONSTANT, My::Very::Long::Module::Name::SECOND_CONSTANT]

在其他地方,我想构建一个包含其中一些常量的数组:

production:
  adapter: postgresql
  database: main
  username: main_user

connect_remote:
  adapter: postgis
  database: secondary
  username: main_user
  schema_search_path: public, postgis

这很烦人。有没有更好的方法,也许不必总是使用模块名称前缀?

3 个答案:

答案 0 :(得分:2)

您可以创建一些别名

M = My::Very::Long::Module::Name
p [M::FIRST_CONSTANT, M::SECOND_CONSTANT]

答案 1 :(得分:2)

这取决于你究竟想要在那里实现的目标。一种可能的解决方案是将您的数组构建得更接近常量。看看这个完全成熟的例子:

module Postable
  FREE_POST_TYPES = ['text', 'image']
  PREMIUM_POST_TYPES = ['video']

  def types
    FREE_POST_TYPES + PREMIUM_POST_TYPES
  end
end

class Article
  extend Postable
end

Article.types # => ["text", "image", "video"]

答案 2 :(得分:0)

您可以使用const_get

%i(FIRST_CONSTANT SECOND_CONSTANT).map { |c|
  My::Very::Long::Module::Name.const_get(c)
}
#=> [1, 2]