【问题标题】:Rails object inheritance with belongs_toRails 对象继承与 belongs_to
【发布时间】:2023-03-19 09:05:02
【问题描述】:

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

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

class Report < ActiveRecord::Base
  has_many :charts
end

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

#<0x104974b90>

  • &lt;

标签: ruby-on-rails inheritance single-table-inheritance


【解决方案1】:

您的问题是您有一个控制器接收所有这些不同类型的模型。当您使用 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 的功能。您应该考虑拥有多个控制器。不要使用ChartsController 来接收所有数据,而是使用GenderChartsControllerLineChartsController。这有两个好处:

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 在您的示例中,@chart 对象实际上是饼图的实例,它是 Chart 的子对象。
    • 我使用@chart 作为Chart 的实例。
    • 对,这对我来说很好用。当我尝试使用 Gender 或 Sex 时,它就成了一个问题。出于某种原因使用 STI,对象似乎属于“类”类型
    • 你的模型看起来怎么样?
    • 模型图有问题
    【解决方案3】:

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

    属于_to:报告

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

    【讨论】:

    • 我遇到同样的错误,我需要在报告模型中添加其他内容吗?其他 has_many :charts ?
    • 你在调用 Chart.report 吗(那会给出 Class 错误,那是错误的),你只能在那个图表模型对象上调用这个方法
    • 类似“chart = Chart.find(:first)”和“chart.report”的东西
    【解决方案4】:

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

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

    【讨论】:

    • 我的图表模型“set_inheritance_column :chart_type”中有以下内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 2012-01-05
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多