Comment faire reculer l'échec d'un rails de la migration? Je m'attends à ce que le rake db:rollback aurait pour effet d'annuler l'échec de la migration, mais non, elle annule la précédente migration (l'échec de la migration moins un). Et rake db:migrate:VERSION=myfailedmigration ne fonctionne pas non plus. J'ai couru dans ce à quelques reprises et c'est très frustrant. Voici un test simple que j'ai fait pour reproduire le problème:
class SimpleTest < ActiveRecord::Migration
def self.up
add_column :assets, :test, :integer
# the following syntax error will cause the migration to fail
add_column :asset, :test2, :integer
end
def self.down
remove_column :assets, :test
remove_column :assets, :test2
end
end
résultat:
== SimpleTest: migration ===================================================== -- add_column(:actifs :test :integer) -> 0.0932 s -- add_column(:actif :erreur) râteau abandonnée! Une erreur s'est produite, tous les migrations annulé: mauvais nombre d'arguments (2 de 3)
ok, permet de rouler en arrière:
$ rake db:rollback == AddLevelsToRoles: le retour =============================================== -- remove_column(:rôles :le niveau) -> 0.0778 s == AddLevelsToRoles: revenue (0.0779 s) ======================================
hein? c'était ma dernière migration avant de SimpleTest, pas l'échec de la migration. (Et oh, ce serait bien si la migration de sortie inclus le numéro de version.)
Donc, nous allons essayer de course vers le bas pour l'échec de migration SimpleTest:
$ rake db:migrate:VERSION=20090326173033 $
Rien ne se passe, et pas de sortie non plus. Mais peut-être, il a couru à la migration de toute façon? Donc permet de corriger l'erreur de syntaxe dans le SimpleTest la migration, et d'essayer de l'exécuter à nouveau.
$ rake db:migrate:VERSION=20090326173033 == SimpleTest: migration ===================================================== -- add_column(:actifs :test :integer) râteau abandonnée! Mysql::Erreur: Duplicate nom de la colonne "test": ALTER TABLE `actifs` AJOUTER `test` int(11)
Nope. Évidemment, la migration:en bas ne fonctionne pas. Ce n'est pas faute, il est juste pas en cours d'exécution.
Pas moyen de se débarrasser de cette double table autres que manuellement en allant dans la base de données et de les retirer, et puis en exécutant le test. Il doit y avoir une meilleure façon que cela.