Search code examples
ruby-on-railsruby-on-rails-3migrationrenamealter-table

How can I rename a database column in a Ruby on Rails migration?


I wrongly named a column hased_password instead of hashed_password.

How do I update the database schema, using migration to rename this column?


Solution

  • rename_column :table, :old_column, :new_column
    

    You'll probably want to create a separate migration to do this. (Rename FixColumnName as you will.):

    bin/rails generate migration FixColumnName
    # creates  db/migrate/xxxxxxxxxx_fix_column_name.rb
    

    Then edit the migration to do your will:

    # db/migrate/xxxxxxxxxx_fix_column_name.rb
    class FixColumnName < ActiveRecord::Migration
      def self.up
        rename_column :table_name, :old_column, :new_column
      end
    
      def self.down
        # rename back if you need or do something else or do nothing
      end
    end
    

    For Rails 3.1 use:

    While, the up and down methods still apply, Rails 3.1 receives a change method that "knows how to migrate your database and reverse it when the migration is rolled back without the need to write a separate down method".

    See "Active Record Migrations" for more information.

    rails g migration FixColumnName
    
    class FixColumnName < ActiveRecord::Migration
      def change
        rename_column :table_name, :old_column, :new_column
      end
    end
    

    If you happen to have a whole bunch of columns to rename, or something that would have required repeating the table name over and over again:

    rename_column :table_name, :old_column1, :new_column1
    rename_column :table_name, :old_column2, :new_column2
    ...
    

    You could use change_table to keep things a little neater:

    class FixColumnNames < ActiveRecord::Migration
      def change
        change_table :table_name do |t|
          t.rename :old_column1, :new_column1
          t.rename :old_column2, :new_column2
          ...
        end
      end
    end
    

    Then just db:migrate as usual or however you go about your business.


    For Rails 4:

    While creating a Migration for renaming a column, Rails 4 generates a change method instead of up and down as mentioned in the above section. The generated change method is:

    $ > rails g migration ChangeColumnName
    

    which will create a migration file similar to:

    class ChangeColumnName < ActiveRecord::Migration
      def change
        rename_column :table_name, :old_column, :new_column
      end
    end