2017-04-16 6 views
0

私は、特定のジョブを処理する2つの "エンジン"を持っています。それぞれのツールは異なるツール/ apiを使用しています。私はEngineモデルを持っていますが、それらの間に共通のデータ/動作を保持していますが、それぞれEngineには他の特定のフィールドやメソッドがあります。私が何をしたいかインスタンス化するRailsモデルを動的に選択するにはどうすればよいですか?

class Engine 
    field :name 
    field :status 
end 

class DefaultEngine 
    field :job_id 

    def process 
    # default engine process 
    # ... 
    end 
end 

class SpecialEngine 

    def process 
    # special engine process 
    # ... 
    end 
end 

class Site 
    field :engine, type: String, default: '::DefaultEngine' 
end 

site.engine値に応じて、正しいエンジンをサブクラス化するためのEngineが責任を作るです。たとえば、コントローラでは次のようにしたいと考えています。

def start 
    job = Engine.create() 
    job.process 
end 

私はいずれのエンジンも直接参照しません。代わりに、Engineに、正しいエンジンがどれかを判断する責任があります。これを処理する方法は何ですか。Engine.createは、SpecialEngineまたはDefaultEngineのインスタンスを返すことができます。

答えて

1
class Site 
    field :engine, type: String, default: '::DefaultEngine' 

    def engine_class 
    @engine_class ||= engine.constantize 
    end 
end 

def start 
    job = site.engine_class.create 
    job.process 
end 
を使用することができます
3

これはruby-on-railsをマークされているので、あなたはconstantize

site.engine # => 'SpecialEngine', your string field 
site.engine.constantize # => SpecialEngine, class 
site.engine.constantize.new # => #<SpecialEngine:0x007fc52c9893a8>, engine instance 
関連する問題