2016-09-26 13 views
1

検索エンジンの実装がいくつかあるとします。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私は完全な名前空間定数Searcher::Engine::XXX FRを解決するにはどうすればよい

@search_engine = Searcher::Engine::XXX 
@search_engine.search 

に入れたシンボルに応じた適切なクラス記号:elasticsearchは何ですか?

EDIT:

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

は動作しません:(GEMから)それは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

答えて

1

検索エンジンがすべて::Searcher::Engineであると仮定する:

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

'Elasticsearch :: Module :: Elasticsearch'と入力すると動作しますが、定数は実際にはここにあります。 –

+0

@ CyrilDuchon-Dorisそれは奇妙です...レールコンソール 'Object.const_get( " :: Searcher :: Engine ::#{'elasticsearch'.titleize} " )' –

+0

'Object.const_get Searcher :: Engine :: ElseSearch ") => Elasticsearch' –

関連する問題