2010-06-14 88 views
4

我在报表和图表之间有一个简单的has_many/belongs_to关系。我遇到的问题是我的Chart模型是有孩子的父母。Rails对象继承belongs_to

所以在我的报告模式,我有

class Report < ActiveRecord::Base 
    has_many :charts 
end 

我的图表模式是父母,在饼图,折线图,条形图全部来自图继承。我不确定belongs_to:报告属于图表模型或图表模型的子项。我得到的错误,当我尝试,因为对象的类型为“类”

未定义的局部变量或方法`#为类<报告”访问chart.report:0x104974b90>

图表模型使用STI所以它的拉动说...图表表格中chart_type列的'Gender'..我错过了什么?

EDIT

 Chart 
    /\ 
    Pie Line 
    /\ 
/ \ 
Gender Sex 

我(使用STI)实例化类型性别,或性别的对象。希望这可以帮助更多。

我有它,因为提交时,因

@chart.update_attributes(params[:chart]) 

感觉自己居然PARAMS [:图表]其PARAMS [:性别]或PARAMS [:性别]

+0

1.你的Chart表有一个'type'列吗? 2.您的Pie和Line类是否从Chart继承? ('Pie 2010-06-24 23:27:18

+0

1.是的,chart_type,我在模型中使用getter处理。是的,派从图表继承。 3.性别和性别是模型,因为他们有自己的计算,他们会运行数据。每种模型或图表类型都有一个计算值的方法,然后调用super来显示,因为它们都显示相同类型的图表(Pie) – Rabbott 2010-06-25 05:16:40

回答

2

你的问题是你有一个控制器接收所有这些不同类型的模型。当你使用Rails表单助手时,他们从实例中获取对象类型并使用它填充参数。这意味着你有params[:gender]而不是params[:chart]

你可以通过重写Rails用来生成表单的方法来解决这个问题。把下面的代码在你的基本图表类:

def self.model_name 
    name = "chart" 
    name.instance_eval do 
    def plural; pluralize; end 
    def singular; singularize; end 
    end 
    return name 
end 

现在,任何类,它是图的一个孩子将被传递到您的接收行动params[:chart]

记住,改变对象的名字,因为我上面概述了可能打破依赖它的一些插件/宝石的功能。你应该看看有多个控制器。而不是有ChartsController来接收所有的数据,有一个GenderChartsControllerLineChartsController。这有两个好处:

  1. 你并不需要更改对象名称
  2. 如果您需要自定义代码在未来的某个特定类型的图表,你不必添加条件语句,使它工作,因为不同的控制器已经为你隔离它。
1

如果所有的图表类型属于一个报告,然后将

 
belongs_to :report 

在父模型(即图表模型在你的情况下,我猜测)。

+0

我得到相同的错误,在报表模型中是否需要其他内容?其他has_many:图表? – Rabbott 2010-06-14 17:00:50

+0

你打电话Chart.report(这将给类错误,多数民众赞成在错误),你只能调用该图表模型对象 – 2010-06-14 17:11:34

+0

这样的东西像“chart = Chart.find(:第一)”和“chart.report” – 2010-06-14 17:12:07

2

您应该能够只使用

class Report < ActiveRecord::Base 
    has_many :charts 
end 

class Chart < ActiveRecord::Base 
    belongs_to :report 
end 

,并呼吁

@chart.report 
@pie.report 
@line.report 
@bar.report 
+0

事情是在您的示例中的@chart对象实际上是一个饼图的实例化,它是Chart的子级。 – Rabbott 2010-06-15 14:36:46

+0

我用'@ chart'作为'Chart'的一个实例。 – 2010-06-15 14:40:36

+0

没错,这对我来说工作得很好。当我尝试使用Gender或Sex时,它就成为一个问题。由于某些原因,使用STI的目的似乎是“Class”类型 – Rabbott 2010-06-15 16:37:41

0

chart_type列需要被重新命名为刚type,除非你明确地改写Base.inheritance_column

您是否明确将单表继承列重命名为chart_type

+0

我在我的图表模型中有以下“set_inheritance_column:chart_type” – Rabbott 2010-06-30 21:35:08

+0

这也会覆盖它。人力资源管理... – nfm 2010-06-30 21:44:21