Rails – 从Rails配置中获取名称空间常量

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

module Searcher module Engine class Elasticsearch end class Algolia end end end 

我想要一个每环境搜索引擎配置。

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

 Rails.application.configure do config.search_engine = :elasticsearch 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)而不是Searcher::Engine::Elasticsearch (我自己的组件)

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

Ruby 2.3.0 Rails 5

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

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