Problème de migration dans Ruby-on-rails
-
02-10-2019 - |
Question
Hé les gars, quand je commence un projet de rails, l'utilisateur du modèle a été conçu et créé. Après toute la partie de la migration, il a créé avec succès la table des « utilisateurs » Postgres. Eh bien, après avoir fait quelques changements au cours du projet, je me suis aperçu que lui manquait un attribut / nouvelle colonne à la table.
Alors, ce que je faisais était de supprimer les utilisateurs de table de Postgres et ajouter une nouvelle colonne à ma première classe rubis de migration:
class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users do |t|
t.string :name
t.string :password
t.string :email
t.string :authorization_token //this is the new attribute that I insert
t.datetime :created_at
t.datetime :updated_at
t.timestamps
end
end
def self.down
drop_table :users
end
end
Alors, quand je lance à nouveau le db: migrate hopping qu'une nouvelle table utilisateur sera créé avec le nouvel attribut: authorization_token, il ne fonctionne pas, mais sans erreur
.(je sais que je ne devrais pas supprimer la table, il y a une autre façon intelligente de le faire)
La solution
sont exécutées une fois les migrations et stockées dans la base de données comme ayant été utilisée (jetez un oeil dans le tableau de schema_migrations). Vous pouvez essayer d'utiliser rake db: migrate: remise à re-exécuter votre migration initiale, mais il est préférable de simplement ajouter de nouvelles migrations (vous ne voulez pas souffler votre base de données quand il a des données en elle) comme suit:
script / migration générer add_authorization_token_to_users authorization_token: string
qui va générer quelque chose de semblable à ce qui suit:
class AddAuthorizationTokenToUsers < ActiveRecord::Migration
def self.up
change_table :users do |t|
t.string :authorization_token //this is the new attribute that I insert
end
end
def self.down
remove_column :users, :authorization_token
end
end
Pour voir comment ajouter / supprimer colonne, change_table, travail etc, jetez un oeil à ActiveRecord :: ConnectionAdapters :: SchemaStatements http://api.rubyonrails.org ou http://guides.rubyonrails.org/ migrations.html
Autres conseils
Une astuce pour travailler avec Rails - ne modifie pas la main vos tables avec SQL. Quand vous avez vu le problème que vous devriez avoir écrit une nouvelle migration comme @nruth a montré. Exécution du râteau. Commande migrate aurait bien fonctionné pour vous
Dans ce cas, puisque vous avez déjà supprimé votre table « utilisateurs » vous avez maintenant le problème que votre schéma de base de données est synchronisé avec ce que Rails pense qu'il est. Pour résoudre ce problème, vous pouvez obtenir le schéma de base de données pour à peu près ce que Rails pense qu'il est à la main la création de la table « utilisateurs », en cours d'exécution de la migration vers le bas, puis ensuite la migration vers le haut. Ou vous pouvez obtenir jusqu'à Rails vitesse avec le fait que la table des 'utilisateurs n'existe plus. Rails renseignements sur la migration des magasins soit une table de schema_info (Rails <2.1) ou table schema_migrations (Rails> = 2.1). Si vous supprimez cette table alors Rails pense que le schéma n'existe pas et essayez d'exécuter toutes les migrations et jusqu'à recréer la table des utilisateurs de nouveau pour vous.
Enfin, au fil du temps vous pouvez accumuler un certain nombre de migrations qui ajoutent individuellement une colonne ou deux que vous avez oublié d'inclure. Si vous n'êtes pas encore livré ou ne sont pas encore dans la production, alors vous pouvez écrire une migration ce genre de lignes de base de votre table. Il ressemblerait à quelque chose comme ceci:
class CreateBaselineUsers < ActiveRecord::Migration
def self.up
create_table :users, :force => true do |t|
t.string :name
...
baissera de force de la table et la recréer avec tous les attributs que vous voulez.