表单中的Rails单表继承(STI)

时间:2012-04-29 09:24:44

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

我有以下域类:

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实例化正确的派生类?

1 个答案:

答案 0 :(得分:2)

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

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