如何在Ruby on Rails迁移中重命名数据库列?

44 浏览
0 Comments

如何在Ruby on Rails迁移中重命名数据库列?

我错误地将一个列命名为hased_password而不是hashed_password

我该如何使用迁移来更新数据库模式以重命名该列?

admin 更改状态以发布 2023年5月22日
0
0 Comments

在我的看来,对于这种情况,最好使用rake db:rollback,然后编辑您的迁移并再次运行rake db:migrate。但是,如果您有不想丢失的列中的数据,则使用rename_column

0
0 Comments

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可以使用:

虽然updown方法仍然适用于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方法,而不是上面提到的updown方法。生成的change方法如下:

$ > rails g migration ChangeColumnName

这将创建一个类似于以下内容的迁移文件:

class ChangeColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

0