2

ActiveRecord モデルが別のモデルのデリゲートとして機能できるようにする mixin を作成しようとしています。したがって、典型的な方法でそれを行います:

class Apple < ActiveRecord::Base
   def foo_species
      "Red delicious"
   end    
end


class AppleWrapper < ActiveRecord::Base
   belongs_to :apple
   # some meta delegation code here so that AppleWrapper 
   # has all the same interface as Apple
end


a = Apple.create
w = AppleWrapper.create
w.apple = a 
w.foo_species
# => 'Red delicious'

私が望むのは、この動作を Mixin に抽象化することです。これにより、多数のデータ モデルが与えられたときに、ActiveRecord でもある「ラッパー」クラスを作成できますが、各ラッパーは特定のクラスに対応します。なんで?各データモデルには計算、他のモデルとの集計があり、「ラッパー」クラスにこれらの計算に対応するフィールド (スキーマ内) を含める必要があります。Wrapper は、元のデータ モデルのキャッシュされたバージョンとして機能し、同じインターフェイスを使用します。

各 Wrapper を書き出す必要があります... Apple、Orange、Pear には、それぞれに異なる Wrapper モデルがあります。ただし、ラッパーの動作を抽象化したいだけです...そのため、ラッパーが指すものを設定するクラスレベルのメソッドがあります。

module WrapperMixin
    extend ActiveSupport::Concern
    module ClassMethods
       def set_wrapped_class(klass)
        # this sets the relation to another data model and does the meta delegation
        end
    end
end


class AppleWrapper < ActiveRecord::Base
    include WrapperMixin
    set_wrapped_class Apple
end

class OrangeWrapper < ActiveRecord::Base
    include WrapperMixin
    set_wrapped_class Orange
end

これをどのように設定しますか?そして、これはSTIタイプの関係でなければなりませんか? つまり、Wrapper クラスには、wrapped_record_id と Wrapped_record_type が必要ですか?

4

1 に答える 1

3

メソッドで使用できbelongs_toますset_wrapped_class

def set_wrapped_class(klass)
  belongs_to klass.to_s.downcase.to_sym
end
于 2013-10-09T03:15:27.857 に答える