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 が必要ですか?