我错误地将列命名为hased_password而不是hashed_password。
如何使用迁移重命名此列来更新数据库架构?
我错误地将列命名为hased_password而不是hashed_password。
如何使用迁移重命名此列来更新数据库架构?
当前回答
生成RubyonRails迁移:
$:> rails g migration Fixcolumnname
在迁移文件中插入代码(XXXXX fixcolumnname.rb):
class Fixcolumnname < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
其他回答
对于Ruby on Rails 4:
def change
rename_column :table_name, :column_name_old, :column_name_new
end
让我们接吻。它只需要三个简单的步骤。以下适用于Rails 5.2。
1.创建迁移
rails g迁移重命名为FullNameInStudentsrails g RenameOldFieldToNewFieldInTableName-这样以后代码库的维护人员就非常清楚了(表名使用复数)。
2.编辑迁移
#我更喜欢显式地编写panddown方法。
# ./数据库/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数据库:迁移
你要去参加比赛了!
如果该列中已经填充了数据并在生产环境中运行,我建议采用一步一步的方法,以便在等待迁移时避免生产环境中的停机。
首先,我将创建一个数据库迁移,以添加具有新名称的列,并用旧列名的值填充它们。
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。
我意识到这是一个更复杂的过程,但我宁愿这样做,也不想在生产迁移中遇到问题。
首先你需要跑步
rails g migration create_new_column_in_tablename new_column:datatype
rails g migration remove_column_in_tablename old_column:datatype
然后需要检查db/migration您可以检查nem迁移中的详细信息,如果所有详细信息都正确,则需要运行:
rails db:migrate
在控制台中:
rails generate migration newMigration
在newMigration文件中:
class FixColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end