Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails: 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?

like image 450
user1994764 Avatar asked Jan 02 '10 16:01

user1994764


People also ask

How do you rename a column in Ruby on Rails?

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 ...

Can you edit a migration file Rails?

Occasionally you will make a mistake when writing a migration. If you have already run the migration then you cannot just edit the migration and run the migration again: Rails thinks it has already run the migration and so will do nothing when you run rake db:migrate.

Can I rename migration file Rails?

You can change the migration file name, but you have to perform a few steps: rake db:rollback to the point that queries table is rolled back. Now change the name of migration file, also the contents. Change the name of any Model that may use the table.


1 Answers

rename_column :table, :old_column, :new_column 

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

script/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 
like image 169
nowk Avatar answered Oct 02 '22 21:10

nowk