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)

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top