2011-11-20 54 views
1

我正在編寫一個報告gem,它將有一些幫助器從ActiveRecord中提取數據。使用相同函數擴展兩個類的最佳體系結構

它將實現的一個函數是to_report_yaml,我需要從單個記錄(ActiveRecord :: Base實例)或從記錄數組中調用。 to_report_yaml的實現在兩種情況下都非常相似,所以我想要的是實現一次,並使用鴨子打字在我的邏輯中做出一些決定。

我的問題是。擴展ActiveRecord :: Base和Array的最好方法是什麼,兩者都有一個叫做to_report_yaml的函數指向相同的實現?

回答

5

你應該在一個模塊中實現你的功能並將它包含到兩個類中。這個概念被稱爲Mixins。它在Ruby庫中被越來越多地使用,並且是Ruby對多繼承的回答(這是一個更廣泛的概念,但通常很難理解它的邊緣情況)。

module MyModule 
    def to_report_yaml 
    self.to_yaml # or whatever 
    end 
end 

class ActiveRecord::Base 
    include MyModule 
end 

class Array 
    include MyModule 
end 
相關問題