Ruby on rails Rails对象继承,其所属对象为

Ruby on rails Rails对象继承,其所属对象为,ruby-on-rails,inheritance,single-table-inheritance,Ruby On Rails,Inheritance,Single Table Inheritance,我有一个简单的报告和图表之间的关系。我遇到的问题是,我的图表模型是一个有孩子的家长 所以在我的报告模型中 class Report < ActiveRecord::Base has_many :charts end 我正在(使用STI)实例化一个类型为Sex或Sex的对象。希望这能起到更多的作用 我有一种感觉,这是由 @chart.update_attributes(params[:chart]) 因为当提交其实际参数[:chart]时,其参数[:gender]或参数[:sex]如

我有一个简单的报告和图表之间的关系。我遇到的问题是,我的图表模型是一个有孩子的家长

所以在我的报告模型中

class Report < ActiveRecord::Base
  has_many :charts
end
我正在(使用STI)实例化一个类型为Sex或Sex的对象。希望这能起到更多的作用

我有一种感觉,这是由

@chart.update_attributes(params[:chart])

因为当提交其实际参数[:chart]时,其参数[:gender]或参数[:sex]

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

belongs_to :report 属于:报告
在父模型中(我猜在您的例子中是图表模型)。

您应该能够使用

class Report < ActiveRecord::Base
  has_many :charts
end

class Chart < ActiveRecord::Base
  belongs_to :report
end

您的
图表类型
列需要重命名为
类型
,除非您显式重写了
Base.heritation\u列


您是否明确地将单表继承列重命名为
图表类型

您的问题是一个控制器接收所有这些不同类型的模型。当您使用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]

请记住,如上所述更改对象名称可能会破坏某些依赖它的插件/gem的功能。您应该考虑使用多个控制器。使用
GenderChartsController
LineChartsController
代替使用
ChartsController
接收所有数据。这有两个好处:

  • 您不需要更改对象名称
  • 如果将来需要特定类型图表的自定义代码,则无需添加条件语句即可使其正常工作,因为不同的控制器已将其隔离

  • 我得到了同样的错误,我是否需要在报表模型中添加其他内容?其他东西有很多:charts?您是否调用Chart.report(这会导致类错误,这是错误的),您只能对该图表模型对象调用此方法,如“Chart=Chart.find(:first)”和“Chart.report”在你的例子中,@chart对象实际上是饼图的一个实例,饼图是chart的一个子类。我使用
    @chart
    作为
    chart
    的一个实例。对,这对我来说很好。当我尝试使用性别或性时,它成为一个问题。出于某种原因使用STI,对象似乎属于“类”类型。您的模型看起来如何?问题1中有模型图。图表表是否有“类型”列?2.您的饼图和线条类是否继承自图表?(
    饼图
    )3。你想在你的树上说明什么是性别和性?他们也上课吗?或饼图模型的属性?1。是的,图表类型,我在模型中用getter处理它。2.是的,饼图继承自图表。3.性别和性别是模型,因为他们有自己的计算,他们会在数据上运行。每个模型或图表类型都有一个计算值的方法,然后调用super来显示,因为它们都显示相同类型的图表(饼图)。我的图表模型“set\u heritation\u column:chart\u type”中有以下内容
    @chart.report
    @pie.report
    @line.report
    @bar.report
    
    def self.model_name
      name = "chart"
      name.instance_eval do
        def plural;   pluralize;   end
        def singular; singularize; end
      end
      return name
    end