使用相同功能扩展两个类的最佳架构

时间:2011-11-20 18:01:51

标签: ruby

我正在编写一个报告gem,它将有一些助手从ActiveRecord中提取数据。

它将实现的一个函数是to_report_yaml,我需要从单个记录(ActiveRecord :: Base实例)或记录数组中调用它。 to_report_yaml的实现在两种情况下非常相似,所以我想要的是实现它一次并使用duck typing在我的逻辑中做出一些决定。

我的问题是。扩展ActiveRecord :: Base和Array的最佳方法是什么,因此两者都有一个名为to_report_yaml的函数指向同一个实现?

2 个答案:

答案 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.extendActiveRecord相同)或creating a lib and using an initializer,等等。