Question

J'ai une séquence de migrations dans une application rails qui comprend les étapes suivantes:

  1. Créer une version de base du modèle "utilisateur"
  2. Créer une instance de ce modèle - il doit y avoir au moins un utilisateur initial dans mon système pour pouvoir vous connecter et commencer à l'utiliser
  3. Mettez à jour le modèle "utilisateur" pour ajouter un nouveau champ / colonne.

Maintenant, j'utilise "validates_inclusion_of". sur ce nouveau champ / colonne. Cela a bien fonctionné sur ma machine de développement initiale, qui avait déjà une base de données avec ces migrations appliquées. Cependant, si je vais sur une nouvelle machine et exécute toutes les migrations, l'étape 2 échoue, car validates_inclusion_of échoue, car le champ de la migration 3 n'a pas encore été ajouté à la classe de modèle.

En guise de solution de contournement, je peux commenter l'option "Valide _...". ligne, lancez les migrations et décommentez-le, mais ce n’est pas bien.

Il serait préférable de réorganiser mes migrations afin que la création d'utilisateur (étape 2) soit la dernière, après l'ajout de toutes les colonnes.

Je suis un débutant dans le secteur des rails, alors je me suis dit que je demanderais quelle est la méthode préférée pour gérer cette situation:)

Était-ce utile?

La solution

Le moyen le plus simple d'éviter ce problème consiste à utiliser rake db: schema: load sur la deuxième machine au lieu de db: migrate. D: S: L utilise schema.rb pour charger la version la plus récente de votre schéma, par opposition à sa migration vers le haut du formulaire.

Si vous rencontrez ce problème lors du déploiement sur une machine de production (où la préservation des données est importante), vous devrez probablement consolider vos migrations en un seul fichier sans conflit.

Autres conseils

Vous pouvez déclarer une classe avec le même nom dans la migration, elle remplacera celle de votre application / modèles:

class YourMigration < ActiveRecord::Migration

  class User < ActiveRecord::Base; end

  def self.up
    # User.create(:name => 'admin')
  end

end

Malheureusement, votre environnement de développement intégré peut essayer de compléter automatiquement en fonction de cette classe (Netbeans le fait) et vous ne pouvez pas utiliser votre logique de modèle ici (sauf si vous la dupliquez).

Je dois le faire maintenant. Sur la base des conseils de BiHi, je charge le modèle manuellement, puis je redéfinis les méthodes là où je le souhaite.

load(File.join(RAILS_ROOT,"app/models/user.rb"))
class User < ActiveRecord::Base
  def before_validation; nil; end # clear out the breaking before_validation
  def column1; "hello"; end       # satisfy validates_inclusion_of :column1
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top