Rails模型中的继承模型

时间:2011-02-18 23:23:04

标签: ruby-on-rails ruby-on-rails-3 forms inheritance activerecord

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

所以我有主要模型:

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],等等我所做的其他继承。

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

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

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

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