Rails模型中的inheritance模型

我正在为我的应用做一个报告系统。 我创建了一个模型ReportKind,但是因为我可以报告很多东西,所以我想制作不同类型的报告类型。 由于它们共享很多行为,我正在尝试使用inheritance。

所以我有主要模型:

model ReportKind << ActiveRecord::Base end 

并创建了例如:

 model UserReportKind << ReportKind end 

在我的表report_kinds中我是类型列,直到这里它全部工作。 我的问题在于表单/控制器。

当我执行ReportKind.new ,我的表单使用’* report_kind *’前缀构建。 如果获取UserReportKind ,即使通过ReportKind.find ,表单也会构建’user_report_kind’前缀。

这会使控制器中的所有内容变得混乱,因为有时候我会有params [:report_kind],有时候是params [:user_report_kind],等等我所做的每一个其他inheritance。

无论如何强迫它使用’report_kind’前缀? 此外,我不得不强制控制器中的属性“类型”,因为它没有从表单直接获取值,是否有一个很好的方法来做到这一点?

路由是另一个问题,因为它试图基于inheritance的模型名称构建路由。 我通过在指向同一控制器的路由中添加其他模型来克服这个问题。

这种inheritance总是很棘手。 幸运的是,你提到的问题都是可以解决的。

首先,您可以强制表单使用特定的属性名称和URL,如下所示:

 <%= form_for :report_kind, @report_kind, :url => report_kind_path(@report_kind) %> 

无论@report_kind是否为UserReportKind,这都会强制@report_kind的所有参数都在params [:report_kind]中。 此外,所有post和put请求也将转到ReportKindsController。

其次,您可以使用隐藏属性指定类型,如下所示:

 <%= form.hidden_field :type, 'UserReportKind' %> 

最后,对于路线,我会做以下事情:

 map.resources :user_report_kinds, :controller => :report_kinds 

这意味着像/ user_report_kinds / …这样的任何URL实际上都会使用ReportKindsController。