我错误地命名的一栏 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

作为滑轨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

谢谢,Luke && Turadg,为使这个话题。

然后,只需db:migrate像往常一样或无论你去了解你的业务。


作为轨道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

如果该列已经被填充数据和现场生产,我建议一个循序渐进的方式,以避免停机生产在等待迁移。

首先我想创建一个分贝迁移到与所述新的名称(一个或多个)添加列,并与来自旧列名的值填充它们。

class AddCorrectColumnNames < ActiveRecord::Migration
  def up
    add_column :table, :correct_name_column_one, :string
    add_column :table, :correct_name_column_two, :string

    puts 'Updating correctly named columns'
    execute "UPDATE table_name SET correct_name_column_one = old_name_column_one, correct_name_column_two = old_name_column_two"
    end
  end

  def down
    remove_column :table, :correct_name_column_one
    remove_column :table, :correct_name_column_two
  end
end

然后我提交只是变化,和推变化到生产中。

git commit -m 'adding columns with correct name'

然后,一旦提交已被推入生产,我会运行。

Production $ bundle exec rake db:migrate

然后,我更新所有视图/控制器,引用旧列名到新的列名的。经过我的测试套件运行,并承诺只是那些变化。 (确保它在本地工作,首先通过了所有的测试后!)

git commit -m 'using correct column name instead of old stinky bad column name'

然后,我推送提交到生产环境。

此时可以不必担心任何种类与迁移本身相关联的停机时间的删除原始列。

class RemoveBadColumnNames < ActiveRecord::Migration
  def up
    remove_column :table, :old_name_column_one
    remove_column :table, :old_name_column_two
  end

  def down
    add_column :table, :old_name_column_one, :string
    add_column :table, :old_name_column_two, :string
  end
end

然后向里推背景这个最新迁移到生产和运行bundle exec rake db:migrate

我意识到这是多一点参与的过程,但我宁愿这样做不是有问题,与我的生产迁移。

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

Available Transformations

rename_column(table_name, column_name, new_column_name):

重命名的列,但保持的类型和内容。

运行下面的命令来创建迁移文件:

rails g migration ChangeHasedPasswordToHashedPassword

然后在db/migrate文件夹中生成的文件写入rename_column如下:

class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
  def change
     rename_column :table_name, :hased_password, :hashed_password
  end
end

从API:

rename_column(table_name, column_name, new_column_name)

有重命名的列,但保持的类型和含量保持相同。

红宝石的上了Rails的支持某些版本/向下的方法来迁移,如果你有向上/向下方法迁移,那么:

def up
    rename_column :table_name, :column_old_name, :column_new_name
end

def down
    rename_column :table_name, :column_new_name, :column_old_name
end

如果您有change方法迁移,那么:

def change
    rename_column :table_name, :column_old_name, :column_new_name
end

有关详细信息,您可以移动 Ruby on Rails的 - 迁移 活动记录迁移

如果你的代码不与其它一个共享的,那么最好的选择就是做只是rake db:rollback 然后编辑在迁移和rake db:migrate您的列名。这就是它

和可以写另一个迁移到重命名列

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

那它。

如果你需要切换列名,您将需要创建一个占位符,以避免重复的列名错误。下面是一个例子:

class SwitchColumns < ActiveRecord::Migration
  def change
    rename_column :column_name, :x, :holder
    rename_column :column_name, :y, :x
    rename_column :column_name, :holder, :y
  end
end

作为另一种选择,如果你不结婚移民的想法,有ActiveRecord的一个引人注目的宝石将处理的名称自动为您更改,DataMapper的风格。你要做的就是在模型中更改列名(并确保你把 Model.auto_upgrade!是在您的model.rb的底部)和中提琴!数据库更新的飞行。

https://github.com/DAddYE/mini_record

请注意:您需要将核弹的 DB / schema.rb ,以防止冲突

仍处于测试阶段,显然并不适合每个人,但仍然有吸引力的选择(我目前正在使用这两个不平凡的生产应用程序没有问题)

如果目前的数据是不是对你很重要,你可以记下你的原迁移使用:

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

没有引号,然后使在原来的迁移的变化和通过再次运行向上迁移:

rake db:migrate

简单地创建一个新的迁移,并且在一个块中,使用rename_column如下。

rename_column :your_table_name, :hased_password, :hashed_password
上轨道4

有关红宝石:

def change
    rename_column :table_name, :column_name_old, :column_name_new
end

手动,我们可以使用以下方法:

我们可以编辑的移徙手动,如:

  • 打开 app/db/migrate/xxxxxxxxx_migration_file.rb

  • 更新 hased_passwordhashed_password

  • 运行以下的命令

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

然后它会去除你的迁移:

$> rake db:migrate:up VERSION=xxxxxxxxx

它将增加的迁移的最新变化。

生成迁移文件:

rails g migration FixName

<强>#创建的db /迁移/ xxxxxxxxxx.rb

修改迁移到你的旨意。

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

运行rails g migration ChangesNameInUsers(或任何你想将它命名)

打开刚刚已经产生,并且在该方法中加入这一行(在def changeend之间)迁移文件:

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

保存文件,并在控制台运行rake db:migrate

检查你的schema.db为了看这个名字已经在数据库中居然变了!

希望这有助于:)

$:  rails g migration RenameHashedPasswordColumn
invoke  active_record
      create    db/migrate/20160323054656_rename_hashed_password_column.rb

打开,移民文件,并修改该文件,如下(确实进入你原来的table_name

class  RenameHashedPasswordColumn < ActiveRecord::Migration
  def change
    rename_column :table_name, :hased_password, :hashed_password
  end
end
 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end

生成on Rails的一个Ruby迁移

$:> rails g migration Fixcolumnname

插入代码在迁移文件(XXXXXfixcolumnname.rb)

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

我们 .它所需要的是三个简单的步骤。以下作品 轨5.2.

1.创建一个移民

  • rails g migration RenameNameToFullNameInStudents

  • rails g RenameOldFieldToNewFieldInTableName -这样这是完全清楚,维护者代码的基础。(使用复数形式表名)。

2.编辑的迁移

# I prefer to explicitly write the起来andmethods.

# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb

class RenameNameToFullNameInStudents < ActiveRecord::Migration[5.2]
  def up
    # rename_column :table_name, :old_column, :new_column
    rename_column :students, :name, :full_name
  end

  def down
            # Note that the columns are reversed
    rename_column :students, :full_name, :name
  end
end

3.运行迁移

rake db:migrate

和你的比赛!

Rails的控制台上打开你的Ruby并输入:

ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column

你有两种方式来这样做:

  1. 在这种类型自动运行的反向编码的,它当回退。

    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
  2. 这种类型,它的运行方法的时候 rake db:migrate 和运行下的方法时 rake db:rollback:

    def self.up
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
    def self.down
      rename_column :table_name,:new_column_name,:old_column_name
    end
    

我在轨道上5.2,并试图在色器件用户重命名列。

rename_column位为我工作,但奇异:table_name扔了“用户表中未找到”错误。多为我工作。

rails g RenameAgentinUser

然后改变迁移文件这样:

rename_column :users, :agent?, :agent

其中:代理?是旧列名。

只需使用命令生成迁移

rails g migration rename_hased_password

这编辑迁移附加以下在变化方法线后

rename_column :table, :hased_password, :hashed_password

这应该可以解决问题。

导轨5个迁移变化

例如:

  

导轨克模型学生student_name:字符串年龄:整数

如果你想改变的 student_name 作为列的名称

请注意: - 如果你不运行的轨分贝:迁移

可以以下步骤做

  

导轨d模型学生student_name:字符串年龄:整数

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

  

导轨克模型学生姓名:字符串年龄:整数

如果您迁移(导轨分贝:迁移),以下选项来改变列名

  

导轨克迁移RemoveStudentNameFromStudent student_name:字符串

     

导轨克迁移AddNameToStudent名:字符串

<强>更新 - CREATE_TABLE的近亲是change_table,用于改变现有的表。它以类似的方式用于CREATE_TABLE但屈服于块中的对象知道更多的花样。例如:

class ChangeBadColumnNames < ActiveRecord::Migration
  def change
    change_table :your_table_name do |t|
      t.rename :old_column_name, :new_column_name
    end
  end
end

本方法是更有效的,如果我们不与其他的alter方法如:删除/添加索引/删除索引/ add列,例如,我们可以进一步做这样的:

# Rename
t.rename :old_column_name, :new_column_name
# Add column
t.string :new_column
# Remove column
t.remove :removing_column
# Index column
t.index :indexing_column
#...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top