0

我有以下域类:

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

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

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

4

1 回答 1

2

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

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

于 2012-04-29T13:34:13.520 回答