我的 Rails 应用程序中有一堆不同的提供程序,每个提供程序都有一个自定义实现。
提供者都存储在数据库中,在从数据库加载对象时应根据其数据决定选择的实现。
这是我想出的解决方案。
/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
您发现使用此解决方案有什么问题吗?你能想出更合适的方法吗?