我在我的Rails应用程序中有一堆不同的提供者,每个提供者都有自定义的实现。Ruby on 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
您是否看到使用此解决方案的任何问题?你能想出一个更合适的方式来做到这一点吗?
这就是我正在寻找的。实施文件是否应该位于'app/models /'中? – nbarraille
是的,他们应该位于那里! –