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