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?
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.
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.
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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With