我有以下域类:
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实例化正确的派生类?
答案 0 :(得分:2)
首先,如果你有不同的状态(klass_id用于KlassRating,type_id用于TypeRating),你真的没有STI。您应该有一个Pilot类等级表和另一个Pilot类型等级表。您可能有一个通用评级类,它引用具有多态外键的特定评级类型。在belongs_to文档中查找多态。
现在对于STI,您没有提到“评级”表中有一个名为“type”的字段。这是必要的,因此如果您存储KlassRating或TypeRating对象实例,它将被存储,以便在您检索它时,它将由预期ruby类的对象存储。