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?
Your problem is probably that the
semestercontains data that cannot be converted tointegers. 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
semestervalue onto the newsemester_idand then drop the column.Keep in mind that you can do ActiveRecord manipulations inside your migration. So you can put that code in there.