# Table inheritance in rails

**URL:** <https://www.ruby-forum.com/t/table-inheritance-in-rails/178527>\
**Category:** Rails\
**Created:** [November 6, 2009, 1:23am UTC](https://www.ruby-forum.com/t/table-inheritance-in-rails/178527 "2009-11-06T01:23:25Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![introvert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c37758/32.png) [@introvert](https://www.ruby-forum.com/u/introvert)\
**Post date:** [November 6, 2009, 1:23am UTC](https://www.ruby-forum.com/t/table-inheritance-in-rails/178527/1 "2009-11-06T01:23:25Z")

</div>

Hello,

Suppose I have 2 models Human and Person and I want to inherit one from  
another so that I could use ‘human’ model/migration as a generic builder  
for smiliar objects as ‘person’, for instance this with the following  
table structure:

human table:  
id  
weight  
size

person table:  
id  
name  
surname  
address

Is it possible to make such table inheritance in rails to be able to  
have ‘base’ model for those that are submodels with different columns?

Thanks in advance!

---

<div class="post-metadata">

**Author:** ![introvert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c37758/32.png) [@introvert](https://www.ruby-forum.com/u/introvert)\
**Post date:** [November 6, 2009, 2:06am UTC](https://www.ruby-forum.com/t/table-inheritance-in-rails/178527/2 "2009-11-06T02:06:59Z")

</div>

On Thu, Nov 5, 2009 at 4:23 PM, Aljaz F. \<  
removed\_email\_address@domain.invalid\> wrote:

> weight
> 
> Thanks in advance!

Yes, this is possible in Rails. Thus, you can read section 19.4 of  
AWDwR  
3rd edition. It  
provides an excellent example of what one would do to achieve table  
inheritance in Rails.

Good luck,

-Conrad

---

<div class="post-metadata">

**Author:** ![introvert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c37758/32.png) [@introvert](https://www.ruby-forum.com/u/introvert)\
**Post date:** [November 6, 2009, 2:13am UTC](https://www.ruby-forum.com/t/table-inheritance-in-rails/178527/3 "2009-11-06T02:13:58Z")

</div>

Aljaz F. wrote:

> Hello,
> 
> Suppose I have 2 models Human and Person and I want to inherit one from  
> another so that I could use ‘human’ model/migration as a generic builder  
> for smiliar objects as ‘person’,

Your data modeling is faulty. Human is not a sub- or superclass of  
Person; rather, they’re near synonyms.

> for instance this with the following  
> table structure:
> 
> human table:  
> id  
> weight  
> size
> 
> person table:  
> id  
> name  
> surname  
> address

Where’s the inheritance here? There are no fields in common except id.  
What do you actually want to do?

> Is it possible to make such table inheritance in rails to be able to  
> have ‘base’ model for those that are submodels with different columns?

Well, there’s single-table inheritance (see the Rails docs), but it’s  
seldom a good idea…

> Thanks in advance!

## Best,

Marnen Laibow-Koser  
[http://www.marnen.org](http://www.marnen.org)  
removed\_email\_address@domain.invalid

---

<div class="post-metadata">

**Author:** ![introvert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c37758/32.png) [@introvert](https://www.ruby-forum.com/u/introvert)\
**Post date:** [November 6, 2009, 3:07am UTC](https://www.ruby-forum.com/t/table-inheritance-in-rails/178527/4 "2009-11-06T03:07:38Z")

</div>

Aljaz F. wrote:

> It might not be the best example but I couldnt think of better one in  
> the moment in wrote this. I have a clear image of what I want to  
> implement.

Then you should be able to explain it more clearly. 🙂

> Is this single or multi-table inheritance?

They’re functionally more or less equivalent, although single-table  
inheritance is rather a perversion of the relational model. The choice  
between the two usually seems to be made on practical grounds.

> Thanks for help

## Best,

Marnen Laibow-Koser  
[http://www.marnen.org](http://www.marnen.org)  
removed\_email\_address@domain.invalid

---

<div class="post-metadata">

**Author:** ![introvert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c37758/32.png) [@introvert](https://www.ruby-forum.com/u/introvert)\
**Post date:** [November 6, 2009, 3:38am UTC](https://www.ruby-forum.com/t/table-inheritance-in-rails/178527/5 "2009-11-06T03:38:49Z")

</div>

Ok - I might be complicating too much.

Heres how I would do it with c++, not 100% sure what approach should I  
take with rails on the database/model level.

If I want to have generic data-storage model Vehicle (which will hold  
information the same information for all the vehicles - car, boat, etc.)

class vehicle holds:  
color, max-speed, …

class car:  
color, max-speed, number of seats, …

class boat:  
color, max-speed, … with some boat-specific columns

I’d just derive car from vehicle and use car-specific data columns  
because similar operations will be called on it as on boat model.

As far as I understand RoR approach: if I have a lot of duplicated code  
in my application, there must be some better solution for my problem.

What do you think?

Marnen Laibow-Koser wrote:

> Aljaz F. wrote:
> 
> > It might not be the best example but I couldnt think of better one in  
> > the moment in wrote this. I have a clear image of what I want to  
> > implement.
> 
> Then you should be able to explain it more clearly. 🙂
> 
> > Is this single or multi-table inheritance?
> 
> They’re functionally more or less equivalent, although single-table  
> inheritance is rather a perversion of the relational model. The choice  
> between the two usually seems to be made on practical grounds.
> 
> > Thanks for help
> 
> ## Best,
> 
> Marnen Laibow-Koser  
> [http://www.marnen.org](http://www.marnen.org)  
> removed\_email\_address@domain.invalid

---

<div class="post-metadata">

**Author:** ![introvert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c37758/32.png) [@introvert](https://www.ruby-forum.com/u/introvert)\
**Post date:** [November 6, 2009, 2:44am UTC](https://www.ruby-forum.com/t/table-inheritance-in-rails/178527/6 "2009-11-06T02:44:54Z")

</div>

It might not be the best example but I couldnt think of better one in  
the moment in wrote this. I have a clear image of what I want to  
implement.

Is this single or multi-table inheritance?

Thanks for help

Marnen Laibow-Koser wrote:

> Aljaz F. wrote:
> 
> > Hello,
> > 
> > Suppose I have 2 models Human and Person and I want to inherit one from  
> > another so that I could use ‘human’ model/migration as a generic builder  
> > for smiliar objects as ‘person’,
> 
> Your data modeling is faulty. Human is not a sub- or superclass of  
> Person; rather, they’re near synonyms.
> 
> > for instance this with the following  
> > table structure:
> > 
> > human table:  
> > id  
> > weight  
> > size
> > 
> > person table:  
> > id  
> > name  
> > surname  
> > address
> 
> Where’s the inheritance here? There are no fields in common except id.  
> What do you actually want to do?
> 
> > Is it possible to make such table inheritance in rails to be able to  
> > have ‘base’ model for those that are submodels with different columns?
> 
> Well, there’s single-table inheritance (see the Rails docs), but it’s  
> seldom a good idea…
> 
> > Thanks in advance!
> 
> ## Best,
> 
> Marnen Laibow-Koser  
> [http://www.marnen.org](http://www.marnen.org)  
> removed\_email\_address@domain.invalid

---

<div class="post-metadata">

**Author:** ![introvert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c37758/32.png) [@introvert](https://www.ruby-forum.com/u/introvert)\
**Post date:** [November 6, 2009, 4:01am UTC](https://www.ruby-forum.com/t/table-inheritance-in-rails/178527/7 "2009-11-06T04:01:46Z")

</div>

On Thu, Nov 5, 2009 at 5:44 PM, Aljaz F. \<  
removed\_email\_address@domain.invalid\> wrote:

> It might not be the best example but I couldnt think of better one in  
> the moment in wrote this. I have a clear image of what I want to  
> implement.
> 
> Is this single or multi-table inheritance?

You can implement this as single table inheritance because a RDBMS  
doesn’t support multi-table inheritance (i.e.one cannot inherit the  
fields  
of another table). If this is what you’re looking for, then you’ll need  
an  
OODB which represents things as object graphs instead of table rows.  
Lastly, Marnen is correct in saying that Person and Human are synonyms  
of one another and I recommend reading up on object oriented design.

Good luck,

-Conrad

---

<div class="post-metadata">

**Author:** ![introvert](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/c37758/32.png) [@introvert](https://www.ruby-forum.com/u/introvert)\
**Post date:** [November 7, 2009, 10:40pm UTC](https://www.ruby-forum.com/t/table-inheritance-in-rails/178527/8 "2009-11-07T22:40:36Z")

</div>

On Fri, Nov 06, 2009 at 01:23:25AM +0100, Aljaz F. wrote:

> human table: id weight size  
> person table: id name surname address

If I understand your question correctly, you need to build the right  
relationships. If you lived in the Star Trek universe, you might have:

```
class Person < ActiveRecord::Base

```

belongs\_to :race  
end  
class Race \< ActiveRecord::Base  
has\_many :people  
end

where @person.race.name should return “human” if you’ve populated the  
race table and created a foreign key in person named “race\_id”.

–  
“Oh, look: rocks!”  
– Doctor Who, “Destiny of the Daleks”
