协慌网

登录 贡献 社区

如何在 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 的更新

同时,在updown的方法仍然适用。 Rails 3.1 接收一个change方法,该方法“知道如何迁移数据库并在回滚迁移时将其反转,而无需编写单独的 down 方法”

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作为用于重命名的列,轨道 4 产生change的方法,而不是updown如在上面提到的答案。生成的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):

重命名列但保留类型和内容。