0

I have the following domain classes:

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

A rating specifies what class or type of aircraft a pilot can fly. If the pilot has a class rating, we need to know which class, so we store the the ID in the STI table.

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

If the pilot has a type rating, we need to know which type, so we store the the ID in the STI table.

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

The problem I have with this is how to get the input from the user in a form. The form I have right now always instantiates a Rating, regardless of whether or not the user selected a class- or type rating in the dropdown. My validations are therefore never evaluated.

How can I have Rails instantiate the proper derived class?

Laurens
  • 2,078
  • 5
  • 29
  • 46

1 Answers1

2

First, if you have different state (klass_id for KlassRating and type_id for TypeRating), you really don't have STI. You should have a table for Pilot class ratings and another table for Pilot type ratings. You might have a generic rating class which references a specific rating type with a polymorphic foreign key. Look up polymorphic in the belongs_to documentation.

Now for STI, you don't mention that you have a field named "type" in the "ratings" table. This is necessary so if you store a KlassRating or a TypeRating object instantiation, that it gets stored so when you retrieve it, it will by an object of the intended ruby class.

Marlin Pierce
  • 9,931
  • 4
  • 30
  • 52
  • Having looked up the polymorphic foreign key I now see where I went wrong. I now have two separate tables for class ratings and type ratings and it is working flawlessly. Thanks! – Laurens May 01 '12 at 07:31