Ruby on rails Rails-从Rails配置中获取名称空间常量

Ruby on rails Rails-从Rails配置中获取名称空间常量,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,假设我有几个搜索引擎的实现 module Searcher module Engine class Elasticsearch end class Algolia end end end 我想要每个环境的搜索引擎配置 我在我的环境中声明了配置(对于某种桥接模式) (我将在特定环境文件中覆盖该文件) 然后在我的搜索控制器中,我想根据我在Rails.configuration.search_engine中输入的符号加载适当的类 @search_engine

假设我有几个搜索引擎的实现

module Searcher
  module Engine
    class Elasticsearch
    end

    class Algolia
    end
  end
end
我想要每个环境的搜索引擎配置

我在我的环境中声明了配置(对于某种桥接模式)

(我将在特定环境文件中覆盖该文件)

然后在我的搜索控制器中,我想根据我在Rails.configuration.search_engine中输入的符号加载适当的类

@search_engine = Searcher::Engine::XXX
@search_engine.search
如何从符号
:elasticsearch
解析完整的命名空间常量
Searcher::Engine::XXX

编辑:

Searcher::Engine.const_get(Rails.configuration.search_engine.to_s.titleize)
不工作:它加载
Elasticsearch
(来自gem)而不是
search::Engine::Elasticsearch
(我自己的组件)

Ruby 2.3.0
Rails 5

假设您的搜索引擎都在
::Searcher::Engine

"::Searcher::Engine::#{Rails.configuration.search_engine.to_s.titleize}".constantize

它似乎不起作用,它仍然被解析为
Elasticsearch:Module
。。。键入
::Searcher::Engine::Elasticsearch
确实有效,所以常量确实在这里。@CyrilDuchon Doris这很奇怪。。。在rails控制台中试试Object.const_get(“::Searcher::Engine::{'elasticsearch.titleize}”)
Object.const_get(“::Searcher::Engine::elasticsearch”)=>elasticsearch
@CyrilDuchon Doris。。只是出于好奇-我想你做的是
Searcher::Engine.const_-get(Rails.configuration.search_-Engine.to_.titleize,false)
Object.const_-get(“::Searcher::Engine::{Rails.configuration.search_-Engine.to_.to_.titleize}”,false)
Object.qualified_-const_-get(::Searcher::Engine:::#{Rails.configuration.search\u engine.to\u s.titleize}“
search::engine.qualified\u const\u get(Rails.configuration.search\u engine.to\u s.titleize)
::Searcher::Engine::Elasticsearch # => Searcher::Engine::Elasticsearch
Searcher::Engine.const_get(Rails.configuration.search_engine.to_s.titleize) # => Elasticsearch
Object.const_get("::Searcher::Engine::#{Rails.configuration.search_engine.to_s.titleize}") # => Elasticsearch
"::Searcher::Engine::#{Rails.configuration.search_engine.to_s.titleize}".constantize