我正在编写一个报告gem,它将有一些助手从ActiveRecord中提取数据.
它将实现的一个函数是to_report_yaml,我需要从单个记录(ActiveRecord :: Base实例)或记录数组中调用它.在两种情况下,to_report_yaml的实现非常相似,所以我想要的是实现它一次并使用duck typing在我的逻辑中做出一些决定.
我的问题是.扩展ActiveRecord :: Base和Array的最佳方法是什么,因此两者都有一个名为to_report_yaml的函数指向同一个实现?
您应该在模块中实现您的功能并将其包含在两个类中.这个概念叫做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
Run Code Online (Sandbox Code Playgroud)