我错误地将列命名为hased_password而不是hashed_password。
如何使用迁移重命名此列来更新数据库架构?
我错误地将列命名为hased_password而不是hashed_password。
如何使用迁移重命名此列来更新数据库架构?
当前回答
从API:
rename_column(table_name, column_name, new_column_name)
这将重命名列,但保持类型和内容不变。
其他回答
如果需要切换列名,则需要创建占位符以避免出现“重复列名”错误。下面是一个示例:
class SwitchColumns < ActiveRecord::Migration
def change
rename_column :column_name, :x, :holder
rename_column :column_name, :y, :x
rename_column :column_name, :holder, :y
end
end
若您的代码并没有和其他代码共享,那个么最好的选择就是只执行rakedb:rollback然后在migration和rakedb:migrate中编辑列名。就是这样
您可以编写另一个迁移来重命名列
def change
rename_column :table_name, :old_name, :new_name
end
就是这样。
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,请使用:
尽管向上和向下方法仍然适用,但Rails3.1收到了一个更改方法,该方法“知道如何迁移数据库,并在回滚迁移时反转数据库,而无需编写单独的向下方法”。
有关详细信息,请参阅“活动记录迁移”。
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:像往常一样迁移,或者不管你怎么做。
对于轨道4:
在创建用于重命名列的Migration时,Rails4生成了一个更改方法,而不是上一节中提到的上下更改方法。生成的更改方法为:
$ > rails g migration ChangeColumnName
这将创建类似于以下内容的迁移文件:
class ChangeColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
运行以下命令以创建迁移文件:
rails g migration ChangeHasedPasswordToHashedPassword
然后在db/migrate文件夹中生成的文件中,按如下方式写入rename_column:
class ChangeOldColumnToNewColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
我在使用PostgreSQL数据库开发Rails 6应用程序时遇到了这个挑战。
以下是我修复它的方法:
在我的例子中,table_name是“Products”,old_column是“SKU”,new_column则是“ProductNumber”。
创建包含用于重命名列的命令的迁移文件:rails生成迁移重命名KUToProductNumberInProducts打开db/migrate目录中的迁移文件:数据库/migrate/2021028082344_rename_sku_to_product_number_in_products.rb添加用于重命名列的命令:类RenameKuToProductNumberInProducts<ActiveRecord::迁移[6.0]def更改#重命名列:表名,:旧列,:新列重命名列:产品,:sku,:product_number终止终止保存,然后运行迁移命令:轨道数据库:移植
现在,您可以通过查看架构文件来确认列的重命名:
db/schema.rb
如果您对列的重命名不满意,可以始终回滚:
rails db:rollback
注意:在调用列名的所有位置,努力将列名修改为新名称。