【问题标题】:Rails Single Table Inheritance (STI) in a form表单中的 Rails 单表继承 (STI)
【发布时间】:2012-04-29 21:34:13
【问题描述】:

我有以下域类:

class Rating < ActiveRecord::Base
  validates :kind_id, presence: true # Kind of rating (Class, Type, ...)
end

等级指定飞行员可以驾驶什么级别或类型的飞机。如果飞行员有一个班级评级,我们需要知道哪个班级,所以我们将 ID 存储在 STI 表中。

class KlassRating < Rating
  validates :klass_id, presence: true
end

如果飞行员有类型评级,我们需要知道是哪种类型,因此我们将 ID 存储在 STI 表中。

class TypeRating < Rating
  validates :type_id, presence: true
end

我遇到的问题是如何在表单中获取用户的输入。我现在拥有的表单总是实例化Rating,无论用户是否在下拉列表中选择了类或类型评级。因此,我的验证从未被评估过。

如何让 Rails 实例化正确的派生类?

【问题讨论】:

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


    【解决方案1】:

    首先,如果您有不同的状态(KlassRating 的 klass_id 和 TypeRating 的 type_id),那么您真的没有 STI。您应该有一个飞行员等级评级表和另一个飞行员类型评级表。您可能有一个通用评级类,它引用具有多态外键的特定评级类型。在 belongs_to 文档中查找多态。

    现在对于 STI,您没有提到“评级”表中有一个名为“类型”的字段。这是必要的,因此如果您存储 KlassRating 或 TypeRating 对象实例化,它会被存储,因此当您检索它时,它将由预期 ruby​​ 类的对象存储。

    【讨论】:

    • 查找了多态外键后,我现在知道哪里出错了。我现在有两个单独的表用于等级等级和类型等级,并且它工作得很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多