J'ai mal nommé une colonne hased_password
au lieu de hashed_password
.
Comment puis-je utiliser une migration de renommer cette colonne?
J'ai mal nommé une colonne hased_password
au lieu de hashed_password
.
Comment puis-je utiliser une migration de renommer cette colonne?
rename_column :table, :old_column, :new_column
Mise à jour:
Vous aurez probablement envie de créer une migration pour ce faire. (Renommer FixColumnName comme vous voulez)
script/generate migration FixColumnName
# creates db/migrate/xxxxxxxxxx_fix_column_name.rb
Puis modifiez la migration pour faire ta volonté.
# 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
Une mise à jour pour les Rails 3.1
Alors que, l' up
et down
méthodes s'appliquent toujours. Rails 3.1 reçoit un change
méthode qui "sait comment migrer votre base de données et à l'inverse quand la migration est annulée sans le besoin d'écrire un distinct méthode"
rails g migration FixColumnName
class FixColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Si vous avez tout un tas de colonnes pour renommer, ou quelque chose qui aurait nécessité de répéter le nom de la table, encore et encore.
rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...
Vous pouvez utiliser change_table
à garder les choses un peu plus soignée.
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
Merci, Luke
&& Turadg
, pour amener le sujet.
Puis juste db:migrate
comme d'habitude ou que vous allez sur votre entreprise.
Si la colonne est déjà rempli avec des données et de vivre dans la production, je vous recommande une approche étape par étape, de manière à éviter les temps d'arrêt de la production pendant l'attente des migrations.
D'abord je voudrais créer une db migration pour ajouter des colonnes avec le nouveau nom(s) et les remplir avec les valeurs de l'ancien nom de la colonne.
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
Ensuite, j'ai commettre ce simple changement, et de pousser le changement dans la production.
git commit -m 'adding columns with correct name'
Puis, une fois que la livraison a été poussé dans la production, j'ai couru.
Production $ bundle exec rake db:migrate
Ensuite, je mettrais à jour toutes les vues et les contrôleurs qui fait référence à l'ancien nom de la colonne pour le nouveau nom de la colonne. Dans ma suite de tests, et de s'engager simplement ces changements. (Après s'être assuré de travailler localement et en passant tous les tests en premier!)
git commit -m 'using correct column name instead of old stinky bad column name'
Ensuite, j'ai push qui s'engagent à la production.
À ce stade, vous pouvez supprimer la colonne d'origine sans se soucier de toute sorte de temps d'arrêt liés à la migration elle-même.
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
Puis poussez cette dernière migration à la production et à exécuter bundle exec rake db:migrate
dans l'arrière-plan.
Je réalise que c'est un peu plus complexe d'un processus, mais je préfère cela que d'avoir des problèmes avec ma production de migration.
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
En vertu de l' Available Transformations
rename_column(table_name, column_name, new_column_name):
Renomme une colonne, mais conserve le type et le contenu.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.