Rails - 从Rails配置获取命名空间常量

问题描述:

假设我有几个搜索引擎实现。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 

如何解决全命名空间的不断Searcher::Engine::XXX FR符号适当类om符号:elasticsearch

编辑:

Searcher::Engine.const_get(Rails.configuration.search_engine.to_s.titleize) 

不起作用:它加载Elasticsearch(从创业板),而不是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 
+0

它似乎没有工作,它仍然在这里解决了'Elasticsearch:Module' ...键入':: Searcher :: Engine :: Elasticsearch'确实可以工作,所以常量真的在这里。 –

+0

@ CyrilDuchon-Doris这是奇怪的...尝试在轨道控制台'Object.const_get( “:: Searcher :: Engine ::#{'elasticsearch'.titleize}” )' –

+0

'Object.const_get(“::搜索器::引擎:: Elasticsearch“) => Elasticsearch' –