Je peux faire Post.delete_all
pour supprimer tous mes articles, mais que se passe-t-il si je veux supprimer tous les articles, commentaires, blogs, etc.? Autrement dit, comment puis-je parcourir tous mes modèles et exécuter le delete_all
méthode?
Réponses
Trop de publicités? rake db:reset
Il recrée votre table à partir des migrations.
Comme suggéré dans les commentaires, un moyen plus rapide de le faire (mais vous devez ajouter une nouvelle tâche de rake) est:
namespace :db do
desc "Truncate all tables"
task :truncate => :environment do
conn = ActiveRecord::Base.connection
tables = conn.execute("show tables").map { |r| r[0] }
tables.delete "schema_migrations"
tables.each { |t| conn.execute("TRUNCATE #{t}") }
end
end
Réponse copiée de: réponse le SO .
Si vous essayez de le faire depuis le code au lieu de la ligne de commande, par exemple avec une méthode Test::Unit::TestCase#teardown
, vous pouvez faire soit
class MyTest < Test::Unit::TestCase
def teardown
ActiveRecord::Base.subclasses.each(&:delete_all)
end
end
ou
class MyTest < Test::Unit::TestCase
def teardown
Rake::Task['db:reset'].invoke
end
end
Je vous préviens cependant: ni l'un ni l'autre n'est particulièrement rapide. Vous êtes certainement mieux avec des tests transactionnels si vous le pouvez.
Si vous voulez simplement recommencer à zéro avec un nouvel ensemble de tables vides, vous devez d'abord vous assurer que vous avez une définition à jour du schéma dans db / schema.rb:
rake db:schema:dump
et alors:
rake db:schema:load
ce qui a pour effet de supprimer des tables, puis de les recréer, sans passer par toute votre batterie de migrations.
Un moyen plus rapide de simplement supprimer les lignes de la table est d'utiliser la commande TRUNCATE.
De nombreuses autres réponses semblent ignorer la différence entre la suppression de lignes et la suppression d'une table. La suppression d'une table détruit les données du tableau et le schéma, ce qui signifie que vous avez besoin de mesures supplémentaires pour recréer les tables. Sean McLeary réponse était le meilleur que j'ai vu, je l'ai donc utilisé en tant que point de départ. Cependant, je pense qu'il est préférable de profiter de la TRUNCATE, parce qu'il devrait être plus rapide et il réinitialise également les auto-incrémentation des clés. Aussi, à l'aide de map
au lieu de each
raccourcit un peu le code.
namespace :db do
desc "Truncate all tables"
task :truncate => :environment do
conn = ActiveRecord::Base.connection
tables = conn.execute("show tables").map { |r| r[0] }
tables.delete "schema_migrations"
tables.each { |t| conn.execute("TRUNCATE #{t}") }
end
end