0

私の Rails アプリケーションには、それぞれがカスタム実装を持つさまざまなプロバイダーがたくさんあります。

プロバイダーはすべて DB に格納されます。選択する実装は、DB からオブジェクトをロードするときに、そのデータに応じて決定する必要があります。

これを行うために私が思いついた解決策を次に示します。

/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 のSingle Inheritance Tableメカニズムを参照することをお勧めします。

作成するクラスはまだxあります ( xは、foo実装したプロバイダーの数です)。Providerこれらのクラスはすべて、メインのActiveRecord クラスから継承します。

ただし、 などのメソッドを記述する必要はありませんload_implementation。プロバイダーのタイプは、データベース テーブル " providers "のデータベース列 " type " に格納されます。

于 2012-08-29T09:14:04.007 に答える
0

ActiveRecord の単一テーブル継承を使用したくない理由はありますか?

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