5

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

所以在我的报告模型中,我有

class Report < ActiveRecord::Base
  has_many :charts
end

而我的 Chart 模型是父模型,其中 Pie、Line、Bar 都继承自 Chart。我不确定belongs_to :report 属于图表模型或图表模型的子项。当我尝试访问 chart.report 时出现错误,因为该对象的类型为“Class”

#< 类:0x104974b90> 的未定义局部变量或方法“报告”

图表模型使用 STI,因此它的拉动说..来自图表表中 chart_type 列的“性别”..我错过了什么?

编辑

      Chart
      /  \
    Pie  Line
    / \
   /   \
Gender Sex

我正在(使用 STI)实例化 Gender 或 Sex 类型的对象。希望这会有所帮助。

我有一种感觉,它是由

@chart.update_attributes(params[:chart])

因为当提交它的实际 params[:chart] 它的 params[:gender] 或 params[:sex]

4

4 回答 4

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
于 2010-06-14T18:00:38.857 回答
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

现在,任何属于 Chart 子级的类都将传递给您的接收操作params[:chart]

请记住,如上所述更改对象名称可能会破坏一些依赖它的插件/宝石的功能。您应该考虑拥有多个控制器。与其让 aChartsController接收所有数据,不如拥有 aGenderChartsController和 a LineChartsController。这提供了两个好处:

  1. 您无需更改对象名称
  2. 如果您将来需要为特定类型的图表自定义代码,则不必添加条件语句来使其工作,因为不同的控制器已为您隔离了它。
于 2010-06-29T17:30:20.070 回答
1

如果所有图表类型都属于一个报表,则放置

属于_to:报告

在父模型中(​​我猜你的情况是图表模型)。

于 2010-06-14T16:54:17.510 回答
0

您的chart_type列需要重命名为 just type,除非您明确覆盖Base.inheritance_column.

您是否将单表继承列显式重命名为chart_type

于 2010-06-29T11:36:01.517 回答