ActiveRecord, single inheritance (STI)

Hi, when using STI, Do I have to set type column's value explicity or is it set by Rails?

Eduardo Yáñez Parareda wrote:

Hi, when using STI, Do I have to set type column's value explicity or is it set by Rails?

Rails handles it all for you.

Chris

It’s set by rails, assuming you have a type column

It's set by rails, assuming you have a type column

Well, I asked it because I have this migration:

class CreateFormations < ActiveRecord::Migration   def self.up     create_table :formations do |t|       # Esta columna es para soportar herencia entre Formation y TeamFormation       t.column :type, :string       t.column :name, :string, :limit => 16, :null => false

      # Atributos para TeamFormations       t.column :match_id, :integer       t.column :team_id, :integer     end

    # Creamos por defecto el tipo de alineación 4-4-2     formation = Formation.create(:name => :'4-4-2') <---- HERE I CREATE AN OBJECT AND     formation.save!     SAVE IT   end

  def self.down     drop_table :formations   end end

Within there I save a new Formation but after that type column is null.

I think that is because it is assumed unless you’re inheriting the model Formation, in your example, you’re creating a new Formation. If you were to create a TeamFormation model -

class TeamFormation < Formation

and then

TeamFormation.create :name => ‘4-4-2’

in your Formation table, it will insert the type TeamFormation. Formation isn’t inheriting anything.

Okay so Formation has your type column then. I don’t believe that you want to be creating objects based on it directly. Try this

class Specialformation < Formation end class Differentformation < Formation end

sf= Specialformation.create(:name => ‘4-4-2’) df = Differentformation.create(:name => ‘3-5-2’) If you peek into your formations table, you should see two new records, with correct type fields.

HTH, Howard