0

我的 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

您发现使用此解决方案有什么问题吗?你能想出更合适的方法吗?

4

2 回答 2

1

我建议看看 Rails 的单一继承表机制。

您仍然需要创建x类(其中x是您在其foo实现中拥有的提供者的数量)。这些类都将继承自一个主ProviderActiveRecord 类。

但是,您不必编写诸如load_implementation. 提供者的类型将存储在数据库表“提供者”的数据库列“类型”中。

于 2012-08-29T09:14:04.007 回答
0

有什么理由你不想使用 ActiveRecord 单表继承?

class FirstProvider < Provider
  def foo
    puts 'foo'
  end
end
于 2012-08-29T09:03:24.443 回答