Answers:
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,请使用:
虽然up
和down
方法仍然适用,但是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
然后db:migrate
像往常一样或随便你去做生意。
对于Rails 4:
在创建Migration
用于重命名列的时,Rails 4会生成一个change
方法代替上述部分中提到的up
和down
。生成的change
方法是:
$ > rails g migration ChangeColumnName
这将创建一个类似于以下内容的迁移文件:
class ChangeColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
self.up
我不会说self.down
“应该总是相反”。具体取决于您的迁移环境。仅仅把“对立”放在首位可能不是“正确”的向下迁移。
def self.up
和def self.down
,def change
它将知道如何回滚。
change
方法不是完全证明,因此倾向于使用up
和down
方法进行复杂的迁移。
我认为,在这种情况下,最好使用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
在后台运行。
我意识到这更多地涉及到流程,但是我宁愿这样做,也不愿与我的产品迁移有关。
execute "Update table_name set correct_name_column_one = old_name_column_one"
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
下 Available Transformations
rename_column(table_name, column_name, new_column_name):
重命名列,但保留类型和内容。
rename_column
。
运行以下命令以创建迁移文件:
rails g migration ChangeHasedPasswordToHashedPassword
然后在文件db/migrate
夹中生成的文件中,编写rename_column
如下:
class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
某些版本的Ruby on 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-迁移或Active Record迁移。
如果您的代码未与其他人共享,那么最好的选择是rake db:rollback
在迁移和中进行修改rake db:migrate
。而已
您可以编写另一个迁移来重命名该列
def change
rename_column :table_name, :old_name, :new_name
end
而已。
rake db:rollback
是一个很好的建议。但是就像您说的那样,只有在尚未推动迁移的情况下。
作为一种替代选择,如果您不喜欢迁移的想法,那么ActiveRecord有一个引人注目的瑰宝,它将为您自动处理名称更改,即Datamapper样式。您要做的就是更改模型中的列名(并确保将Model.auto_upgrade!放在model.rb的底部)和中提琴!数据库是动态更新的。
https://github.com/DAddYE/mini_record
注意:您需要删除db / schema.rb以防止冲突
仍处于测试阶段,显然并不适合所有人,但仍然是一个令人信服的选择(我目前正在两个非平凡的生产应用程序中使用它,都没有问题)
我们可以手动使用以下方法:
我们可以像这样手动编辑迁移:
打开 app/db/migrate/xxxxxxxxx_migration_file.rb
更新hased_password
到hashed_password
运行以下命令
$> rake db:migrate:down VERSION=xxxxxxxxx
然后它将删除您的迁移:
$> rake db:migrate:up VERSION=xxxxxxxxx
它将使用更新的更改添加您的迁移。
让我们吻一下。它只需要三个简单的步骤。以下是Rails 5.2的工作。
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName
-这样一来,以后的代码维护者就很清楚了。(表名称使用复数形式)。
# I prefer to explicitly write the
向上and
向下methods.
# ./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
rake db:migrate
您将参加比赛!
$: 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
对于这种类型,它将在以下情况下运行up方法,rake db:migrate
并在以下情况下运行down方法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
更新 -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
如果我们使用其他更改方法,例如:remove / add index / remove index / add column,这种方法会更有效,例如,我们可以进一步做类似的事情:
# 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
#...
只需使用命令生成迁移
rails g migration rename_hased_password
在编辑迁移之后,在更改方法中添加以下行
rename_column :table, :hased_password, :hashed_password
这应该可以解决问题。
Rails 5迁移变更
例如:
rails g model学生student_name:字符串年龄:整数
如果您想将student_name列更改为名称
注意:-如果不运行rails db:migrate
您可以执行以下步骤
rails d model学生student_name:字符串年龄:整数
这将删除生成的迁移文件,现在您可以更正列名
型号:学生姓名:字符串年龄:整数
如果要迁移(rails db:migrate),请使用以下选项来更改列名
Rails g迁移RemoveStudentNameFromStudent学生名称:字符串
rails g migration AddNameToStudent名称:字符串
rails g migration RemoveStudentNameFromStudentS student_name:string
学生人数众多)吗?