Ajout d’une colonne à une table existante dans une migration Rails

J’ai un modèle Utilisateurs qui nécessite une colonne :email (j’ai oublié d’append cette colonne lors de l’échafaudage initial).

J’ai ouvert le fichier de migration et ajouté t.ssortingng :email , rake db:migrate , et obtenu un NoMethodError . Puis j’ai ajouté la ligne

 add_column :users, :email, :ssortingng 

rake db:migrate encore rake db:migrate , encore NoMethodError fois NoMethodError . Est-ce que je manque une étape ici?

Edit: voici le fichier de migration.

 class CreateUsers < ActiveRecord::Migration def self.up add_column :users, :email, :string create_table :users do |t| t.string :username t.string :email t.string :crypted_password t.string :password_salt t.string :persistence_token t.timestamps end end def self.down drop_table :users end end 

Si vous avez déjà exécuté votre migration d’origine (avant de l’éditer), vous devez générer une nouvelle migration (les rails generate migration add_email_to_users email:ssortingng fera l’affaire). Ensuite, faites un rake db:migrate et cela lancera la nouvelle migration.

Si vous n’avez pas encore exécuté la migration d’origine, vous pouvez simplement la modifier, comme vous essayez de le faire. Votre code de migration est presque parfait: il vous suffit de supprimer complètement la ligne add_column (ce code tente d’append une colonne à une table avant que la table n’ait été créée et votre code de création de table a déjà été mis à jour pour inclure un t.ssortingng :email quand même).

Utilisez cette commande sur les rails de la console rails generate migration add_fieldname_to_tablename fieldname:ssortingng

et

rake db:migrate pour exécuter cette migration

Vous pouvez aussi faire

rake db:rollback

Si vous n’avez pas ajouté de données aux tables. Ensuite, modifiez le fichier de migration en y ajoutant la colonne email, puis appelez

rake db:migrate

Cela fonctionnera si des rails 3.1 sont installés sur votre système.

Une méthode beaucoup plus simple consiste à modifier le fichier de migration en l’état. utilisation

$rake db:migrate:redo .

Cela annulera la dernière migration et la migrera à nouveau.

Pour append une colonne, je devais simplement suivre ces étapes:

  1. rails generate migration add_fieldname_to_tablename fieldname:ssortingng

    Alternative

    rails generate migration addFieldnameToTablename

    Une fois la migration générée, modifiez la migration et définissez tous les atsortingbuts que vous souhaitez append à cette colonne.

    Remarque : Les noms de table dans Rails sont toujours au pluriel (pour correspondre aux conventions du DB). Exemple utilisant l’une des étapes mentionnées précédemment

    rails generate migration addEmailToUsers

  2. rake db:migrate

Ou

  1. Vous pouvez modifier le schéma à partir de db/schema.rb , Ajouter les colonnes de votre db/schema.rb dans la requête SQL.
  2. Exécutez cette commande: rake db:schema:load

    Avertissement / Remarque

    Gardez à l’esprit que, en exécutant rake db:schema:load efface automatiquement toutes les données de vos tables.

Parfois, les rails generate migration add_email_to_users email:ssortingng génère une migration comme celle-ci

 class AddEmailToUsers < ActiveRecord::Migration[5.0] def change end end 

Dans ce cas, vous devez change manuellement une ligne supplémentaire.

 class AddEmailToUsers < ActiveRecord::Migration[5.0] def change add_column :users, :email, :string end end 

Et puis exécutez rake db:migrate

Lorsque je l’ai fait, plutôt que de modifier la migration d’origine, j’en crée une nouvelle avec juste la colonne add dans la section up et une colonne drop dans la section down.

Vous pouvez modifier l’original et le réexécuter si vous migrez entre les deux, mais dans ce cas, je pense que cette migration ne fonctionnera pas correctement.

Dans la version actuelle, vous ajoutez la colonne et créez la table.

Si vous modifiez l’ordre, cela pourrait fonctionner. Ou, lorsque vous modifiez une migration existante, ajoutez-la simplement à la table de création au lieu de créer une colonne d’ajout distincte.

Vous pouvez également forcer à placer des colonnes dans la table en utilisant force: true , si votre table existe déjà.

exemple :

 ActiveRecord::Schema.define(version: 20080906171750) do create_table "authors", force: true do |t| t.ssortingng "name" t.datetime "created_at" t.datetime "updated_at" end end 

Vous pouvez annuler la dernière migration par

 rake db:rollback STEP=1 

ou restaurer cette migration spécifique par

 rake db:migrate:down VERSION= 

et éditez le fichier, puis lancez rake db:mirgate nouveau.

Vous pouvez également le faire. Rails g migration add_column_to_users email: ssortingng

puis rake db: migrate ajoute également: atsortingbut email dans votre contrôleur utilisateur;

pour plus de détails, consultez http://guides.rubyonrails.org/active_record_migrations.html