如何在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方法,“知道如何迁移数据库并在迁移回滚时将其反转,而无需编写单独的停用方法”

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

感谢LukeTuradg提出这个话题。

然后,只需db:migrate像往常一样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

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?

下一篇: Google Data Source JSON not valid?