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:
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
rake db:migrate
Ou
db/schema.rb
, Ajouter les colonnes de votre db/schema.rb
dans la requête SQL. 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