inheritance with rails.

Hello. I've read about examples on inheritance with rails. Here is an example:

The way is to add a type field in the table. So if I have an Animal class with an attribute name, I can inherit from this class like:

Dog < Animal, Cat < Animal, and so on.

With the type field in the table I can do Dog.all, Cat.all having automaticaly all dogs, all cats, etc. But what if I want to add some other attributes to Dog or Cat classes? In the example above all classes have only name attribute. What if I want inherit from Animal extending attributes and adding, for example, an attribute like canFly? for inherited classes?

Hello.

I’ve read about examples on inheritance with rails.

Here is an example:

http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/

The way is to add a type field in the table.

So if I have an Animal class with an attribute name, I can inherit

from this class like:

Dog < Animal, Cat < Animal, and so on.

With the type field in the table I can do Dog.all, Cat.all having

automaticaly all dogs, all cats, etc.

But what if I want to add some other attributes to Dog or Cat classes?

In the example above all classes have only name attribute.

What if I want inherit from Animal extending attributes and adding,

for example, an attribute like canFly? for inherited classes?

Hi,

You can add columns to the animals table that only some classes use. IMHO this is not a nice solution.

I have written the SuperSTI gem that I think offers a nicer solution. Read about it at http://www.ihid.co.uk/projects/super_sti and https://github.com/ihid/super_sti

Feel free to email me personally to discuss it further.

Jeremy Walker

http://www.ihid.co.uk

It creates a table for every inherited class. So in my example I must have a table animals, a table dogs and a table cats. It's the same if I create different models: Animal, Dog, Cat without using inheritance.

No, it creates an animals table, and then creates extra linked tables for any extra attributes. So you’d create an animals table with all the shared attributes, then a dogs table that only has the extra attributes on there. So you don’t have any duplication, and don’t have a load of nullable columns on a super table.