我在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
您是否发现使用此解决方案有任何问题?你能想到更合适的方法吗?
答案 0 :(得分:1)
我建议看看Rails的Single Inheritance Table机制。
您仍然可以创建 x 类(其中 x 是您的foo
实施提供商的数量)。这些类都将继承自主Provider
ActiveRecord类。
但是,您不必编写load_implementation
等方法。提供程序的类型将存储在数据库表“ providers ”的数据库列“ type ”中。
答案 1 :(得分:0)
您是否有任何理由不想使用ActiveRecord单表继承?
class FirstProvider < Provider
def foo
puts 'foo'
end
end