2013-10-08 70 views
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?

回答

2

您可以在set_wrapped_class方法中使用belongs_to

def set_wrapped_class(klass) 
    belongs_to klass.to_s.downcase.to_sym 
end 
相關問題