Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails Model Inheritance

Tags:

If I have a User and I want to make different types of users, say just normal users with only an email and subscribers who have a website field, how would I make subscribers inherit everything from Users with just an added field?

like image 776
DudeGuySomethingTimes Avatar asked Jun 21 '11 17:06

DudeGuySomethingTimes


People also ask

How does inheritance work in Rails?

Two methods that Rails gives us to deal with this event are single-table inheritance and polymorphic association. In Single-Table Inheritance (STI), many subclasses inherit from one superclass with all the data in the same table in the database.

What is STI in Ruby?

Single-table inheritance (STI) is the practice of storing multiple types of values in the same table, where each record includes a field indicating its type, and the table includes a column for every field of all the types it stores.

What is a standard prerequisite for implementing single-table inheritance?

Second and more important, you need to have one column per attribute on any subclass, and any attribute that is not shared by all the subclasses must accept nil values.

What is polymorphic association in Rails?

In Ruby on Rails, a polymorphic association is an Active Record association that can connect a model to multiple other models. For example, we can use a single association to connect the Review model with the Event and Restaurant models, allowing us to connect a review with either an event or a restaurant.


2 Answers

You would need to create a table with all of the fields, as well as specify a type column. i.e

create_table :users do |t|   t.string :email   t.string :website   t.string :type end 

Then you can have classes like

Class User < ActiveRecord::Base  Class Subscriber < User 

A subscriber will inherit everything from the Users model. The type column is there so that you can distinguish from the different models. For instance using

Subscriber.all  

Will only get subscribers, where as if you did not use the 'type' column it would also find users too.

like image 200
Kyle d'Oliveira Avatar answered Oct 24 '22 18:10

Kyle d'Oliveira


You want single table inheritance, described at the link by Alex Reisner. STI uses a single table to represent multiple models that inherit from a base model. In the Rails world, the database schema has a column which specifies the type of model represented by the row. Adding a column named type in a database migration has Rails infer the table uses STI, although the column can be an arbitrary name if you specify the name in the data model (see the class method 'inheritance_column'). Note that this makes type a reserved word.

like image 40
Fred Avatar answered Oct 24 '22 18:10

Fred