Single Table Inheritance - Basic


I am struggling with a simple Single table Inheritance example.

I have two models, generated as follows:
script/generate scaffold Contact type:string created_at:datetime
script/generate scaffold Person fname:string lname:string

I amended the Person model:

class Person < Contact

I then expected to be able to create a Person, with a fname, but this
fails (the following is from script/console):-

@person = => #<Person id: nil, type: "Person", created_at: nil, updated_at: nil>
@person.fname = "niciliketo"

NoMethodError: undefined method `fname=' for #<Person:0xb6e8e5fc>
        from /home/nic/site/crm/vendor/rails/activerecord/lib/
active_record/attribute_methods.rb:251:in `method_missing'
        from (irb):2

The examples I can find are pretty terse, and don't seem to explain
why this isn't working. Can anyone tell me why this happens?

Did you run the database migration?

Because that's not quite what single table inheritance does. The
parent class is Contact, so instances of Person (and all other
subclasses of Contact) are rows in the contacts tables and thus have
the attributes that you specified when you created the contact model
(ie type and created_at)


Yes, I ran the db migrations after creating the scaffolding and
changing the models.

rake db:drop:all;
rake db:create:all;
rake db:migrate;

Thanks Percy,

Got it. I guess the clue is in the SINGLE TABLE piece :slight_smile:

Apologies for my misunderstanding, and thanks for putting me straight.