What's the syntax for dropping a database table column through a Rails migration?
23 Answers
remove_column :table_name, :column_name For instance:
remove_column :users, :hobby would remove the hobby Column from the users table.
5For older versions of Rails
ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype For Rails 3 and up
rails generate migration RemoveFieldNameFromTableName field_name:datatype 7Rails 4 has been updated, so the change method can be used in the migration to drop a column and the migration will successfully rollback. Please read the following warning for Rails 3 applications:
Rails 3 Warning
Please note that when you use this command:
rails generate migration RemoveFieldNameFromTableName field_name:datatype The generated migration will look something like this:
def up remove_column :table_name, :field_name end def down add_column :table_name, :field_name, :datatype end Make sure to not use the change method when removing columns from a database table (example of what you don't want in the migration file in Rails 3 apps):
def change remove_column :table_name, :field_name end The change method in Rails 3 is not smart when it comes to remove_column, so you will not be able to rollback this migration.
5In a rails4 app it is possible to use the change method also for removing columns. The third param is the data_type and in the optional forth you can give options. It is a bit hidden in the section 'Available transformations' on the documentation .
class RemoveFieldFromTableName < ActiveRecord::Migration def change remove_column :table_name, :field_name, :data_type, {} end end There are two good ways to do this:
remove_column
You can simply use remove_column, like so:
remove_column :users, :first_name This is fine if you only need to make a single change to your schema.
change_table block
You can also do this using a change_table block, like so:
change_table :users do |t| t.remove :first_name end I prefer this as I find it more legible, and you can make several changes at once.
Here's the full list of supported change_table methods:
Clear & Simple Instructions for Rails 5 & 6
- WARNING: You will lose data.
- Warning: the below instructions are for trivial migrations. For complex migrations with e.g. millions of rows, read/write dbs, clusters, this advice is not for you:
1. Create a migration
Run the following command in your terminal:
rails generate migration remove_fieldname_from_tablename fieldname:fieldtype (Table name in plural, as per convention. See the documentation here. )
Example: rails g migration RemoveAcceptedFromQuotes accepted:boolean
2. Check the migration
# db/migrate/20190122035000_remove_accepted_from_quotes.rb class RemoveAcceptedFromQuotes < ActiveRecord::Migration[5.2] # with rails 5.2 you don't need to add a separate "up" and "down" method. def change remove_column :quotes, :accepted, :boolean end end 3. Run the migration
rake db:migrate or rails db:migrate (they're both the same)
....And then you're off to the races!
1Generate a migration to remove a column such that if it is migrated (rake db:migrate), it should drop the column. And it should add column back if this migration is rollbacked (rake db:rollback).
The syntax:
remove_column :table_name, :column_name, :type
Removes column, also adds column back if migration is rollbacked.
Example:
remove_column :users, :last_name, :string Note: If you skip the data_type, the migration will remove the column successfully but if you rollback the migration it will throw an error.
in rails 5 you can use this command in the terminal:
rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE for example to remove the column access_level(string) from table users:
rails generate migration remove_access_level_from_users access_level:string and then run:
rake db:migrate 0Remove Columns For RAILS 5 App
rails g migration Remove<Anything>From<TableName> [columnName:type] Command above generate a migration file inside db/migrate directory. Snippet blow is one of remove column from table example generated by Rails generator,
class RemoveAgeFromUsers < ActiveRecord::Migration def up remove_column :users, :age end def down add_column :users, :age, :integer end end I also made a quick reference guide for Rails which can be found at here.
You can try the following:
remove_column :table_name, :column_name rails g migration RemoveXColumnFromY column_name:data_type X = column name
Y = table name
EDIT
Changed RemoveXColumnToY to RemoveXColumnFromY as per comments - provides more clarity for what the migration is actually doing.
To remove the column from table you have to run following migration:
rails g migration remove_column_name_from_table_name column_name:data_type Then run command:
rake db:migrate remove_column in change method will help you to delete the column from the table.
class RemoveColumn < ActiveRecord::Migration def change remove_column :table_name, :column_name, :data_type end end Go on this link for complete reference :
Give below command it will add in migration file on its own
rails g migration RemoveColumnFromModel After running above command you can check migration file remove_column code must be added there on its own
Then migrate the db
rake db:migrate For removing column from table in just easy 3 steps as follows:
- write this command
rails g migration remove_column_from_table_name
after running this command in terminal one file created by this name and time stamp (remove_column from_table_name).
Then go to this file.
inside file you have to write
remove_column :table_name, :column_nameFinally go to the console and then do
rake db:migrate
Heres one more from rails console
ActiveRecord::Migration.remove_column(:table_name, :column_name)
Step 1: Create a migration
rails g migration remove_column_name_from_table Step 2: Change code in file migration just created
rails version < 3
def change remove_column :table_name, :column_name, :datatype end rails version >= 3
def change remove_column :table_name, :column_name end Step 3: Migrate
rake db:migrate 1Simply, You can remove column
remove_column :table_name, :column_name For Example,
remove_column :posts, :comment first try to create a migration file running the command:
rails g migration RemoveAgeFromUsers age:string and then on the root directory of the project run the migration running the command:
rails db:migrate Through
remove_column :table_name, :column_name
in a migration file
You can remove a column directly in a rails console by typing:
ActiveRecord::Base.remove_column :table_name, :column_name
Do like this;
rails g migration RemoveColumnNameFromTables column_name:type
I.e. rails g migration RemoveTitleFromPosts title:string
Anyway, Would be better to consider about downtime as well since the ActiveRecord caches database columns at runtime so if you drop a column, it might cause exceptions until your app reboots.
Ref: Strong migration
0- Mark the column as ignored in the model
class MyModel < ApplicationRecord self.ignored_columns = ["my_field"] end - Generate a migration
$ bin/rails g migration DropMyFieldFromMyModel - Edit the migration
class DropMyFieldFromMyModel < ActiveRecord::Migration[6.1] def change safety_assured { remove_column :my_table, :my_field } end end - Run the migration
$ bin/rails db:migrate Just run this in the rails console
ActiveRecord::Base.connection.remove_column("table_name", :column_name, :its_data_type) or
TableName.find_by_sql(“ALTER TABLE table_name DROP column_name”) 1