# Active Record Inheritence

**URL:** <https://www.ruby-forum.com/t/active-record-inheritence/72140>\
**Category:** Ruby\
**Created:** [October 14, 2006, 5:53pm UTC](https://www.ruby-forum.com/t/active-record-inheritence/72140 "2006-10-14T17:53:49Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![bizzz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/bbe5ce/32.png) [@bizzz](https://www.ruby-forum.com/u/bizzz)\
**Post date:** [October 14, 2006, 5:53pm UTC](https://www.ruby-forum.com/t/active-record-inheritence/72140/1 "2006-10-14T17:53:49Z")

</div>

Greetings,

I’m having some troubles getting single table inheritance  
working. I’m outside of rails, and I _think_ I understand  
the way this whole thing is supposed to work. I’ve got  
tables in a PostgreSQL database, (principal and user, the  
User class extends Principal).

When I run the following code I get an error like so:

/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active\_record/base.rb:1789:in  
`method_missing': undefined method`first\_name=’ for  
#\<User:0xb7d815cc @attributes={“type”=\>“User”},  
@new\_record=true\> (NoMethodError)

When I change the class definition of User to extend  
ActiveRecord::Base the code works and I wind up with rows in  
the users table.

Any ideas what I’m not doing correctly?

The code:

#!/usr/bin/ruby

#CREATE TABLE principals (

# id integer DEFAULT nextval(‘id\_seq’::text) NOT NULL,

# “type” text

#);

# 

# 

#CREATE TABLE users (

# id integer DEFAULT nextval(‘id\_seq’::text) NOT NULL,

# username text,

# “password” text,

# first\_name text,

# last\_name text

#);

require ‘rubygems’  
require ‘active\_record’

ActiveRecord::Base.establish\_connection(  
:adapter =\> “postgresql”,  
:host =\> “localhost”,  
:username =\> “org”,  
:password =\> “xx”,  
:database =\> “org”  
)

class Principal \< ActiveRecord::Base

end

class User \< Principal

end

u = User.new  
u.first\_name = ‘joejoe’

---

<div class="post-metadata">

**Author:** ![bizzz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/bbe5ce/32.png) [@bizzz](https://www.ruby-forum.com/u/bizzz)\
**Post date:** [October 14, 2006, 6:32pm UTC](https://www.ruby-forum.com/t/active-record-inheritence/72140/2 "2006-10-14T18:32:00Z")

</div>

Hi –

On Sun, 15 Oct 2006, Andrew L. wrote:

> /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active\_record/base.rb:1789:in
> 
> # id integer DEFAULT nextval(‘id\_seq’::text) NOT NULL,
> 
> :adapter =\> “postgresql”,  
> class User \< Principal
> 
> end
> 
> u = User.new  
> u.first\_name = ‘joejoe’

If you want to do single table inheritance, you need to use a single  
table 🙂 You’re using two (principals and users).

Try the following:

1. add a type/text column to users
2. get rid of principals
3. in the models, do:

```
class User < ActiveRecord::Base
end

class Principal < User
end

```

I know I’ve reversed the inheritance flow; it seems to make more sense  
this way, but you can of course switch it around.

David

---

<div class="post-metadata">

**Author:** ![bizzz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/bbe5ce/32.png) [@bizzz](https://www.ruby-forum.com/u/bizzz)\
**Post date:** [October 14, 2006, 7:24pm UTC](https://www.ruby-forum.com/t/active-record-inheritence/72140/3 "2006-10-14T19:24:27Z")

</div>

removed\_email\_address@domain.invalid wrote:

> 1. in the models, do:
> 
> David

Thanks for your comments. It seems I completely missed  
what single table inheritance is all about. You’d thing by  
calling it single table, I’d have gotten that it was  
_single\_table_… I’m hoping to have other principal types  
in my system (groups, systems, users, etc). I guess I’ll  
need to work something out with  
has\_a, am I pointing in the right direction?

Thanks.

Andy

---

<div class="post-metadata">

**Author:** ![bizzz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/bbe5ce/32.png) [@bizzz](https://www.ruby-forum.com/u/bizzz)\
**Post date:** [October 14, 2006, 7:42pm UTC](https://www.ruby-forum.com/t/active-record-inheritence/72140/4 "2006-10-14T19:42:31Z")

</div>

Hi –

On Sun, 15 Oct 2006, Andrew L. wrote:

> > Try the following:
> 
> table, I’d have gotten that it was _single\_table_… I’m hoping to have other  
> principal types in my system (groups, systems, users, etc). I guess I’ll  
> need to work something out with  
> has\_a, am I pointing in the right direction?

The has\_one stuff is separate from the STI stuff. The basic idea of  
STI is that you have one table (principals [switching my example back  
to the way yours was]) that has columns for _all_ of the attributes  
that _any_ of the descendants might have. In other words, the single  
table is a flattened, centralized collection. This is, in a sense,  
illogical. It means that if you have, say, a people table, and then  
subclasses of Person like Employee and Customer, technically Customers  
will have all of the same characteristics as Employees – including,  
perhaps, salary. The point though is that in exchange for a bit of  
weirdness in the database table, you receive a lot of ease at the Ruby  
end, where you can accomplish a lot just through inheritance.

In the case you’re describing, if principals is the single table, it  
would have to include all the future fields for groups, systems, and  
users. That makes me wonder whether STI is actually a good fit for  
this case. You should only use STI when the descendant classes are  
pretty similar, and only diverge in a small number of fields. It  
sounds like a system and a user would be very different from each  
other.

The associations (has\_one/belongs\_to, etc.) might make more sense  
here. A User could belong\_to a group; Group would have many users;  
and so forth.

David
