2
我正在嘗試創建一個允許ActiveRecord模型充當另一個模型的委託的混入。所以,這樣做的典型方式:如何動態設置ActiveRecord中的belongs_to關聯?
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,從而使給定一組數據模型,我可以創造「包裝」,同時也是ActiveRecords類,但每個包裝對應於一個特定的類。爲什麼?每個數據模型都有計算,與其他模型進行聚合,我希望「包裝器」類包含與這些計算相對應的字段(在模式中)......實際上是這樣。 Wrapper充當原始數據模型的緩存版本,具有相同的接口。
我將不得不寫出每個包裝...所以對於Apple,Orange,Pear,每個人都有不同的包裝模型。不過,我只是想抽象出包裝行爲......讓有,設置什麼樣的包裝指向一個一流水平的方法,一拉:我將如何設置此
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?