How to rename a column and change its type by migration same time

ruby-on-rails, ruby-on-rails-3

Solution

Your problem is probably that the `semester` contains data that cannot be converted to `integers`. That's why you get a cast error.

I suspect you need to do more work to make this work as the only thing that comes to mind is removing the column and creating a new one with the correct values.

But you can simply remove_column and then add_column in one migration. That should work flawlessly.

I'd also suggest you only add_column first, then do the mapping process where you map the old `semester` value onto the new `semester_id` and then drop the column.

Keep in mind that you can do ActiveRecord manipulations inside your migration. So you can put that code in there.

Problem

In my `general_exams` table, I have a column named `semester`, type is `string`. Now I want to change its name to `semester_id`, type is `integer`. I have read about migration and it has available transformations: - rename_column(table_name, column_name, new_column_name): Renames a column but keeps the type and content. - change_column(table_name, column_name, type, options): Changes the column to a different type using the same parameters as add_column. So, I create my migration file like this: ``` class RenameSemesterFromGeneralExams < ActiveRecord::Migration def change rename_column :general_exams, :semester, :semester_id change_column :general_exams, :semester_id, :integer end end ``` But, when I run `rake db:migrate`, it has error: ``` == RenameSemesterFromGeneralExams: migrating ================================= -- rename_column(:general_exams, :semester, :semester_id) -> 0.0572s -- change_column(:general_exams, :semester_id, :integer) rake aborted! An error has occurred, this and all later migrations canceled: PG::Error: ERROR: column "semester_id" cannot be cast to type integer : ALTER TABLE "general_exams" ALTER COLUMN "semester_id" TYPE integer ``` In my table GeneralExam, I destroyed all data. So, anyone can tell me how can I do that? Or I must create two migration files?

Original source