我错误地将列命名为hased_password而不是hashed_password。
如何使用迁移重命名此列来更新数据库架构?
我错误地将列命名为hased_password而不是hashed_password。
如何使用迁移重命名此列来更新数据库架构?
当前回答
只需使用以下方法生成迁移:
rails g migration rename_hased_password
之后,编辑迁移并在更改方法中添加以下行:
rename_column :table, :hased_password, :hashed_password
这应该会奏效。
其他回答
请参阅“活动记录迁移”文档中的“可用转换”部分。
rename_column(table_name, column_name, new_column_name):
重命名列,但保留类型和内容。
生成RubyonRails迁移:
$:> rails g migration Fixcolumnname
在迁移文件中插入代码(XXXXX fixcolumnname.rb):
class Fixcolumnname < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
您可以编写迁移,运行以下命令以更新列名:
rename_column :your_table_name, :hased_password, :hashed_password
此外,确保用新列名更新代码中旧列名的任何用法。
首先你需要跑步
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
如果该列中已经填充了数据并在生产环境中运行,我建议采用一步一步的方法,以便在等待迁移时避免生产环境中的停机。
首先,我将创建一个数据库迁移,以添加具有新名称的列,并用旧列名的值填充它们。
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。
我意识到这是一个更复杂的过程,但我宁愿这样做,也不想在生产迁移中遇到问题。