Comment puis-je renommer une colonne de firebase database dans une migration Ruby on Rails?

J’ai mal nommé une colonne hased_password au lieu de hashed_password .

Comment mettre à jour le schéma de la firebase database en utilisant la migration pour renommer cette colonne?

 rename_column :table, :old_column, :new_column 

Mettre à jour:

Vous souhaiterez probablement créer une migration distincte pour ce faire. (Renommez FixColumnName comme vous voulez)

 script/generate migration FixColumnName # creates db/migrate/xxxxxxxxxx_fix_column_name.rb 

Ensuite, éditez la migration pour faire votre 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 Rails 3.1

Pendant que, les méthodes de up down s'appliquent toujours. Rails 3.1 reçoit une méthode de change qui "sait comment migrer votre firebase database et l'inverser lorsque la migration est annulée sans qu'il soit nécessaire d'écrire une méthode séparée"

 rails g migration FixColumnName class FixColumnName < ActiveRecord::Migration def change rename_column :table_name, :old_column, :new_column end end 

Si vous avez beaucoup de colonnes à 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 pour garder les choses un peu plus nettes.

 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 avoir soulevé le sujet.

Ensuite, db:migrate simplement la db:migrate comme d'habitude ou selon vos besoins.


Une mise à jour pour Rails 4

Lors de la création d'une Migration comme pour renommer une colonne, Rails 4 génère une méthode de change au lieu de up ou de down comme indiqué dans la réponse ci-dessus. La méthode de change générée est la suivante:

 $ > rails g migration ChangeColumnName 

qui va créer un fichier de migration similaire à ceci:

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

OMI, dans ce cas, mieux vaut utiliser rake db:rollback . Ensuite, modifiez votre migration et de nouveau tapez rake db:migrate . Cependant, si vous avez des données dans la colonne que vous ne voulez pas perdre, utilisez rename_column .

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

Sous Available Transformations

rename_column(table_name, column_name, new_column_name):

Renomme une colonne mais conserve le type et le contenu.

Si la colonne contient déjà des données et est en cours de production, je recommande une approche pas à pas afin d’éviter les temps d’arrêt dans la production en attendant les migrations.

D’abord, je créerais une migration de firebase database pour append des colonnes avec le ou les nouveaux noms et les remplir avec les valeurs de l’ancien nom de 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, je commettrais juste ce changement et mettais le changement en production.

 git commit -m 'adding columns with correct name' 

Ensuite, une fois que le commit a été mis en production, je courrais.

 Production $ bundle exec rake db:migrate 

Ensuite, je mettrais à jour tous les vues / contrôleurs qui référencaient l'ancien nom de colonne au nouveau nom de colonne. Parcourez ma suite de tests et validez uniquement ces modifications. (Après s'être assuré que cela fonctionnait localement et avoir passé tous les tests en premier!)

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

Ensuite, je pousse cet engagement à la production.

À ce stade, vous pouvez supprimer la colonne d'origine sans se soucier des temps d'arrêt associé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 

Poussez ensuite cette dernière migration vers la production et exécutez bundle exec rake db:migrate en arrière-plan.

Je me rends compte que c'est un peu plus compliqué dans un processus, mais je préfère le faire plutôt que d'avoir des problèmes avec ma migration de production.

Exécutez la commande ci-dessous pour créer un fichier de migration:

 rails g migration ChangeHasedPasswordToHashedPassword 

Puis, dans le fichier généré dans le dossier db/migrate , écrivez rename_column comme ci-dessous:

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

De l’API:

 rename_column(table_name, column_name, new_column_name) 

Il renomme une colonne mais conserve le même type et le même contenu.

Certaines versions de Ruby on Rails prennent en charge les méthodes de migration vers le haut / bas et si vous avez une méthode de migration vers le haut / bas:

 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 

Si vous avez la méthode de change dans votre migration, alors:

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

Pour plus d’informations, vous pouvez déplacer: Ruby on Rails – Migrations ou Active Record Migrations .

Si votre code n’est pas partagé avec un autre, alors la meilleure option est de faire simplement rake db:rollback puis éditez le nom de votre colonne dans la migration et rake db:migrate . C’est tout

Et vous pouvez écrire une autre migration pour renommer la colonne

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

C’est tout.

Si vous devez changer de nom de colonne, vous devez créer un espace réservé pour éviter une erreur de nom de colonne en double . Voici un exemple:

 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 

En guise d’alternative, si vous n’êtes pas marié à l’idée des migrations, il existe un joyau incontournable pour ActiveRecord qui gérera automatiquement les changements de nom, le style Datamapper. Tout ce que vous faites est de changer le nom de la colonne dans votre modèle (et assurez-vous de mettre Model.auto_upgrade! Au bas de votre model.rb) et alto! La firebase database est mise à jour à la volée.

https://github.com/DAddYE/mini_record

Note: Vous devrez nuke db / schema.rb pour éviter les conflits

Toujours en phase bêta et évidemment pas pour tout le monde mais toujours un choix convaincant (je l’utilise actuellement dans deux applications de production non sortingviales sans problèmes)

Si les données actuelles ne vous importent pas, vous pouvez simplement supprimer votre migration d’origine à l’aide de:

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

Sans les guillemets, apportez des modifications à la migration d’origine et exécutez à nouveau la migration vers le haut en:

 rake db:migrate 

Créez simplement une nouvelle migration et, dans un bloc, utilisez rename_column comme ci-dessous.

 rename_column :your_table_name, :hased_password, :hashed_password 

Pour Ruby on Rails 4:

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

Manuellement, nous pouvons utiliser la méthode ci-dessous:

Nous pouvons modifier la migration manuellement comme:

  • Ouvrez app/db/migrate/xxxxxxxxx_migration_file.rb

  • Mettre à jour hased_password vers hashed_password

  • Exécutez la commande ci-dessous

     $> rake db:migrate:down VERSION=xxxxxxxxx 

Ensuite, il supprimera votre migration:

 $> rake db:migrate:up VERSION=xxxxxxxxx 

Il appenda votre migration avec le changement mis à jour.

Générez le fichier de migration:

 rails g migration FixName 

# Crée db / migrate / xxxxxxxxxx.rb

Modifiez la migration pour faire votre volonté.

 class FixName < ActiveRecord::Migration def change rename_column :table_name, :old_column, :new_column end end 
 $: rails g migration RenameHashedPasswordColumn invoke active_record create db/migrate/20160323054656_rename_hashed_password_column.rb 

Ouvrez ce fichier de migration et modifiez ce fichier comme suit (entrez votre nom de table_name original)

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

Exécuter les rails g migration ChangesNameInUsers (ou tout ce que vous souhaitez nommer)

Ouvrez le fichier de migration qui vient d’être généré et ajoutez cette ligne dans la méthode (entre def change et end ):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

Enregistrez le fichier et exécutez rake db:migrate dans la console

Consultez votre schema.db pour voir si le nom a réellement changé dans la firebase database!

J’espère que cela t’aides 🙂

Générez une migration Ruby on Rails :

 $:> rails g migration Fixcolumnname 

Insérez le code dans le fichier de migration (XXXXXfixcolumnname.rb) :

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

Ouvrez votre console Ruby on Rails et entrez:

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

Vous avez deux façons de le faire:

  1. Dans ce type, il exécute automatiquement le code inverse de celui-ci, lors de la restauration.

     def change rename_column :table_name, :old_column_name, :new_column_name end 
  2. Pour ce type, il exécute la méthode up lorsque rake db:migrate et exécute la méthode down lorsque 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 

Il suffit de générer la migration en utilisant la commande

 rails g migration rename_hased_password 

Après cela, éditez la migration append la ligne suivante dans la méthode de modification

 rename_column :table, :hased_password, :hashed_password 

Cela devrait faire l’affaire.

Rails 5 changements de migration

par exemple:

rails g modèle Etudiant nom_élève: chaîne age: entier

si vous voulez changer la colonne nom_élève comme nom

Remarque: – si vous n’exécutez pas les rails db: migrez

Vous pouvez faire les étapes suivantes

rails d modèle Etudiant nom_élève: chaîne age: entier

Cela supprimera le fichier de migration généré, vous pouvez maintenant corriger le nom de votre colonne

rails g modèle Nom de l’étudiant: ssortingng age: entier

Si vous avez migré (rails db: migrate), suivez les options suivantes pour modifier le nom de la colonne

rails g migration RemoveStudentNameFromStudent nom_etudiant: chaîne

rails g migration AddNameToStudent name: chaîne

Update – Un cousin proche de create_table est change_table, utilisé pour changer les tables existantes. Il est utilisé de la même manière que create_table mais l’object cédé au bloc connaît plus de trucs. Par exemple:

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

Cette méthode est plus efficace si nous utilisons d'autres méthodes telles que: supprimer / append un index / supprimer une colonne d'index / add, par exemple, nous pouvons faire plus comme:

 # Rename t.rename :old_column_name, :new_column_name # Add column t.ssortingng :new_column # Remove column t.remove :removing_column # Index column t.index :indexing_column #...