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

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


当前回答

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

其他回答

如果当前数据对您不重要,您可以使用以下方法删除原始迁移:

rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'

如果没有引号,请在原始迁移中进行更改,然后通过以下方式再次运行升级迁移:

rake db:migrate

您有两种方法可以做到这一点:

在这种类型中,当回滚时,它会自动运行与其相反的代码。def更改重命名列:表名称,:旧列名称,:新列名称终止对于这种类型,它在rakedb:migrate时运行up方法,在rakedb:rollback时运行down方法:定义self.up重命名列:表名称,:旧列名称,:新列名称终止定义自己向下重命名列:表名称,:新列名称,:旧列名称终止

若您的代码并没有和其他代码共享,那个么最好的选择就是只执行rakedb:rollback然后在migration和rakedb:migrate中编辑列名。就是这样

您可以编写另一个迁移来重命名列

 def change
    rename_column :table_name, :old_name, :new_name
  end

就是这样。

作为另一种选择,如果您不喜欢迁移,ActiveRecord有一个引人注目的优点,它将自动为您处理名称更改,Datamapper风格。您只需更改模型中的列名,并确保将model.auto_upgrade!在model.rb和viola的底部!数据库随时更新。

看见https://github.com/DAddYE/mini_record

注意:您需要nuke db/schema.rb来防止冲突。

它仍然处于测试阶段,显然不适合所有人,但它仍然是一个令人信服的选择。我目前在两个非平凡的生产应用程序中使用它,没有任何问题。

Rails 5迁移更改

eg:

rails g model学生Student_name:字符串年龄:整数

如果要将student_name列更改为name

注意:-如果没有运行railsdb:migrate

您可以执行以下步骤

rails d model学生Student_name:字符串年龄:整数

这将删除生成的迁移文件,现在您可以更正列名

rails g model学生姓名:string年龄:整数

如果已迁移(railsdb:migrate),请使用以下选项更改列名

rails g迁移RemoveStudentNameFromStudent student_name:字符串rails g迁移AddNameToStudent名称:字符串