Rails 4:决定在父类初始值设定项中使用哪个继承的子类

时间:2014-02-16 15:24:37

标签: class inheritance ruby-on-rails-4

我有一个Report类,有几个模型继承自(OverviewReport,CategoryReport等)。这些继承的类中的每一个都具有需要为该类型的报告定制的特定方法/属性。

所需的报告类型通过params哈希传递,因此我可以执行以下操作:

# reports_controller.rb
def index
  case params[:type]
    when "overview" then OverviewReport.new(...)
    when "category" then CategoryReport.new(...)
    ...etc...
  end
end

这有效,但我想稍微清理一下控制器。我希望能够做到这一点:

# reports_controller.rb
def index
  @report = Report.new(params[:type], ...)
end

# report.rb class
def initialize(type, options)
  case type
    when "overview" then self = OverviewReport.new(type, options)
    when "category" then self = CategoryReport.new(type, options)
  end
end

但是,您无法更改self的值,那么您将如何完成此功能呢?

目的是清理控制器代码并抽象出您正在使用的报告,因此我可以调用@report.some_method(),它将调用特定于继承的方法。

是否有一个干净的解决方案,或者我在控制器中遇到(有些)冗长的案例陈述?

一种解决方案是使用“工厂”类,其唯一目的是实例化正确的类:

# reports_controller.rb
def index
  @report = AgnosticReport.new(type)
end

# agnostic_report.rb
def initialize(type)
  case type
    when "overview" then return OverviewReport.new(type)
    when "category" then return CategoryReport.new(type)
    ...etc...
  end
end

这是完全可以接受的,但我想知道是否需要在这种情况下添加“第三层”类。

1 个答案:

答案 0 :(得分:0)

您是否有能力更改传递的类型参数?

如果是这样,我会使用constantize

params [:type]是“概述报告”或“类别报告”e.t.c。

然后使用 @report = params [:type] .constantize.new

s =“OverviewReport”,

s.constantize => OverviewReport