Comment écrire conditionnelle migrations dans les rails?
Je suis à la recherche de façons d'écrire les migrations dans des rails qui peuvent être exécutées sur la base de données plusieurs fois sans faute.
Par exemple, supposons que j'ai cette migration:
class AddUrlToProfile < ActiveRecord::Migration
def self.up
add_column :profile, :url, :string
end
def self.down
remove_column :profile, :url
end
end
Si le url
colonne existe déjà dans le Profile
table (si le schéma.rb a été modifié de façon inattendue, par exemple), mon échec de la migration de dire que c'est un doublon!
Donc comment exécuter cette migration que si elle a pour?
Grâce
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire quelque chose comme ceci:
Ceci permet de réinitialiser les informations d'une colonne avant qu'il ne commence - s'assurer que le modèle de Profil a le up-to-date information de la colonne de la table. Il n'aura alors qu'à ajouter la colonne si elle n'existe pas. La même chose se passe pour la fonction de recherche, mais il ne supprime la colonne si elle existe.
Si vous avez plusieurs cas d'utilisation pour ce que vous pourriez facteur le code dans une fonction et de ré-utiliser dans votre migrations.
class Profile < ActiveRecord::Base ; end
en haut de la migration de la définition de la classe.Pour Rails 3.X, il y a le
column_exists?(:table_name, :column_name)
méthode.Pour Rails 2.X, vous pouvez vérifier l'existence de colonnes avec les éléments suivants:
...ou si vous n'êtes pas dans un fichier de migration:
Si elle renvoie nil, aucune colonne de ce type n'existe. Si elle renvoie un Fixnum, puis la colonne n'existe pas. Naturellement, vous pouvez mettre plus sélective des paramètres entre la
{...}
si vous souhaitez identifier une colonne par plus que juste son nom, par exemple:Cela devrait fonctionner
Enveloppant ma migration dans un conditionnelle a fonctionné pour moi.
Rails 4.X