如何在Ruby on Rails迁移中重命名数据库列?
如何在Ruby on Rails迁移中重命名数据库列?
我错误地将一个列命名为hased_password
而不是hashed_password
。
我该如何使用迁移来更新数据库模式以重命名该列?
admin 更改状态以发布 2023年5月22日
rename_column :table, :old_column, :new_column
你可能需要创建一个单独的迁移来完成此操作(将FixColumnName
重命名为你想要的名称):
bin/rails generate migration FixColumnName # creates db/migrate/xxxxxxxxxx_fix_column_name.rb
然后编辑迁移文件以完成你想要的操作:
# 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
对于Rails 3.1可以使用:
虽然up
和down
方法仍然适用于Rails 3.1,但是Rails 3.1还提供了一个change
方法,它“知道如何在不需要编写单独的down
方法的情况下迁移数据库并在回滚时将其恢复”。
有关更多信息,请参见《Active Record迁移》。
rails g migration FixColumnName class FixColumnName < ActiveRecord::Migration def change rename_column :table_name, :old_column, :new_column end end
如果你需要重命名一堆列或者有一些需要多次重复表名的任务:
rename_column :table_name, :old_column1, :new_column1 rename_column :table_name, :old_column2, :new_column2 ...
你可以使用change_table
使事情变得更整洁:
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
然后像往常一样执行db:migrate
或者其他你惯用的方式。
对于Rails 4:
在为重命名列创建Migration
时,Rails 4将生成一个change
方法,而不是上面提到的up
和down
方法。生成的change
方法如下:
$ > rails g migration ChangeColumnName
这将创建一个类似于以下内容的迁移文件:
class ChangeColumnName < ActiveRecord::Migration def change rename_column :table_name, :old_column, :new_column end end