Single Table Inheritance - Basic


#1

Hi,

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
updated_at:datetime
script/generate scaffold Person fname:string lname:string

I amended the Person model:

class Person < Contact
end

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

@person = Person.new => #<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:inmethod_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?


#2

Did you run the database migration?

2009/4/28 removed_email_address@domain.invalid removed_email_address@domain.invalid


#3

On Apr 28, 1:57 pm, “removed_email_address@domain.invalid” removed_email_address@domain.invalid
wrote:

    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?

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)

Fred


#4

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.


#5

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;