Removing fields with a Rails migration
Ruby on Rails gives you powerful tools to make removing old fields easy, lets walk through how we can do this
Over time your Rails models will contain fields that no longer serve a purpose. To make things easier to maintain, you should remove fields that aren’t useful. Rails provides an easy way to do this.
In our imaginary system, we have the model Artist
. When we first made the system, we thought that their eye colour would be a thing we needed. As the system matured, we realised that no one was using this attribute. After speaking to the stakeholders, we decide to remove eye_colour
from our system.
In our terminal, we can type rails g migration RemoveEyeColourFromArtists eye_colour:string
rails g migration
tells Rails to create a new migration for us. g
is short for generate
. If you prefer, you can write rails generate migration
.
We start with the word Remove
which tells Rails that this migration is about removing.
EyeColour
is the field we will be dropping, this names the migration appropriately.
FromArtists
lets Rails know the table we will be performing the migration on. Note the plural Artists
, tables are always plural, to indicate they contain many of something.
Finally, we want to describe the field we are removing. It feels weird to define your attribute again, but migrations can have many actions inside them. eye_colour:string
lets Rails know that the field we will be deleting is eye_colour
and that it was a string
.
We don’t need to tell Rails it was a string. It will delete any field so long as the name matches. What we gain by giving Rails this extra bit of information is the ability to undo the migration, more on that later.
When we run this command we get this as part of the output;
create db/migrate/20200323105013_remove_eye_colour_from_artists.rb
All your migrations will live in db/migrate/
.
The numbers are the year, month, day, hour, minute, and second we ran the command. This level of specificity helps reduce clashes and helps you to see when you made a migration.
remove_eye_colour_from_artists
is what we typed in earlier, made lower case and with _
(snake case is the name for this).
Inside your new migration file, you will see a change method.
def change
remove_column :artists, :eye_colour, :string
end
The method change
gets ran when we do a rails db:migrate
and also when we do rails db:rollback
. When we do a rollback the opposite of what we ask happens. This is why we set string
as the data type. When we do rails db:rollback
Rails will know to recreate the field with the appropriate type.
This article is a part of the "Rails migrations" series
- Rails Migrations for Beginners
- How to change the column type with Rails migrate
- This Article
- Running Rails migrations automatically on Heroku
- How to comment Rails migrations
- Create or remove columns or tables with Rails migrations
- Rails migrations - add default value to existing column
- What are the square brackets in my Rails migrations?
- What are Rails Migrations
- Forcing a Rails database column to be not null
- Irreversible Rails Migrations