我正在编写一个报告gem,它将有一些助手从ActiveRecord中提取数据。
它将实现的一个函数是to_report_yaml,我需要从单个记录(ActiveRecord :: Base实例)或记录数组中调用它。 to_report_yaml的实现在两种情况下非常相似,所以我想要的是实现它一次并使用duck typing在我的逻辑中做出一些决定。
我的问题是。扩展ActiveRecord :: Base和Array的最佳方法是什么,因此两者都有一个名为to_report_yaml的函数指向同一个实现?
答案 0 :(得分: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
答案 1 :(得分:3)
打开课程并包含一个定义该功能的模块。
有几个教程,例如this one。
果壳:
module NewStuff
def to_report_yaml
# YAML it up
end
end
class Array
include NewStuff
end
有几种方法可以实现,包括creating a gem and using Array.extend
(ActiveRecord
相同)或creating a lib and using an initializer,等等。