Ruby on Rails:具有不同实现的模型

时间:2012-08-29 08:33:00

标签: ruby-on-rails ruby inheritance

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

您是否发现使用此解决方案有任何问题?你能想到更合适的方法吗?

2 个答案:

答案 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