如何在Ruby on Rails迁移中重命名数据库列?
我错误地命名了hased_password
列而不是hashed_password
。
如何更新数据库模式,使用迁移来重命名此列?
rename_column :table, :old_column, :new_column
更新:
您可能需要创建一个单独的迁移来执行此操作。 (如你所愿重命名FixColumnName)
script/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接收一种change
方法,“知道如何迁移数据库并在迁移回滚时将其反转,而无需编写单独的停用方法”
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
感谢Luke
& Turadg
提出这个话题。
然后,只需db:migrate
像往常一样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
IMO,在这种情况下,更好地使用rake db:rollback
。 然后编辑您的迁移并再次输入rake db:migrate
。 但是,如果列中的数据不想丢失,请使用rename_column
。
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
在Available Transformations
rename_column(table_name, column_name, new_column_name):
重命名列,但保留类型和内容。
链接地址: http://www.djcxy.com/p/8281.html上一篇: How can I rename a database column in a Ruby on Rails migration?