2010-10-10 4 views

Répondre

4

Le code lui-même est simple.

Note.delete_all :type => 'short_note' 

(Si les notes ont détruit callbacks, vous devrez exécuter destroy_all à la place. Il est plus lent parce qu'ils sont supprimés un par un, mais peut parfois produire une meilleure intégrité des données.)

Cependant , J'imagine que vous êtes un peu plus inquiet de la migration vers le bas que de la migration vers le haut. C'est une transformation irréversible par nature. La réponse à cette partie particulière de la question est que votre migration devrait déclencher une exception ActiveRecord::IrreversibleMigration. Toutefois, chaque fois que vous écrivez une migration irréversible, il est important de savoir pourquoi vous le faites. Selon votre situation, il est peut-être plus approprié d'exécuter cette commande particulière dans la console lors du déploiement en production que de faire de cette migration une partie de la définition même de votre application.

+0

Non, ne spécifiez pas la clé ': conditions'! La méthode 'delete_all' prend juste des conditions, pas une spécification générale' find'. –

+0

@Chris Jester-Young: bonne prise :) Fixe. – Matchu

0
def self.up 
    execute "DELETE FROM notes WHERE note_type = 'short_note'" 
end 

:-P

Just kidding. Je suis sûr que vous pouvez le faire:

Note.delete_all :note_type => 'short_note' 
0

Dans le self.up:

Note.delete_all("type = 'short_note'"); 

ou utiliser destroy_all qui fera appel à détruire la méthode de l'enregistrement et callbacks (before_destroy et after_destroy):

Note.destroy_all("type = 'short_note'"); 
+0

Je préfère largement utiliser les formes de hachage et/ou de tableau lorsque cela est possible, et n'utiliser la forme de chaîne que lorsque je dois écrire directement en SQL. De cette façon, personne n'est tenté de le refactoriser dans un formulaire ouvert à l'injection SQL au cas où il souhaite supprimer un type paramétré. –

+0

Comment nous allons écrire si la valeur est nulle. '" type = NULL "' ?? –

Questions connexes