一尘不染

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

javascript

我错误地命名了一个列hased_password而不是hashed_password.

如何更新数据库架构,使用迁移重命名此列?


阅读 135

收藏
2022-02-22

共1个答案

一尘不染

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

虽然updown方法仍然适用,但 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方法,而不是上面部分中提到的upand 。down生成的change方法是:

$ > rails g migration ChangeColumnName

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

class ChangeColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end
2022-02-22