私の Rails アプリケーションには、それぞれがカスタム実装を持つさまざまなプロバイダーがたくさんあります。
プロバイダーはすべて DB に格納されます。選択する実装は、DB からオブジェクトをロードするときに、そのデータに応じて決定する必要があります。
これを行うために私が思いついた解決策を次に示します。
/app/models/provider.rb
class Provider < ActiveRecord::Base
attr_accessible :name
validates :name, :presence => true
after_find :load_implementation
# Loads the correct implementation for the provider
def load_implementation
case self.name
when "FirstProvider"
extend FirstProvider
when "SecondProvider"
extend SecondProvider
else
raise "No implementation for provider #{self.name}"
end
end
end
/lib/first_provider.rb
module FirstProvider
def foo
puts "foo"
end
end
/lib/second_provider.rb
module SecondProvider
def foo
puts "bar"
end
end
そして、これが私がそれを使用する方法です:
Providers.all.each do |p|
p.foo
end
このソリューションの使用に問題はありますか? これを行うためのより適切な方法を考えることができますか?