web-dev-qa-db-fra.com

Supprimer tous les enregistrements d'une table de base de données

Comment puis-je supprimer tous les enregistrements de l'une de mes tables de base de données dans une Ruby sur Rails app?

121
Justin Meltzer

Si vous cherchez un moyen de le faire sans SQL, vous devriez pouvoir utiliser delete_all.

Post.delete_all

ou avec un critère

Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"

Voir ici pour plus d'informations.

Les enregistrements sont supprimés sans les charger au préalable, ce qui le rend très rapide, mais va casser des fonctionnalités telles que le cache du compteur qui dépend du code Rails à exécuter lors de la suppression).

232
HakonB

Supprimer via SQL

Item.delete_all # accepts optional conditions

Pour supprimer en appelant la méthode destroy de chaque modèle (coûteux, mais garantit que les rappels sont appelés)

Item.destroy_all # accepts optional conditions

Tous ici

28
lebreeze

si vous voulez vider complètement la base de données et ne pas simplement supprimer un modèle ou des modèles qui y sont attachés, vous pouvez faire:

rake db:purge

vous pouvez également le faire sur la base de données de test

rake db:test:purge
21
KensoDev

Si vous voulez dire supprimer chaque instance de tous les modèles, je voudrais utiliser

ActiveRecord::Base.connection.tables.map(&:classify)
  .map{|name| name.constantize if Object.const_defined?(name)}
  .compact.each(&:delete_all)
5
dfaulken
BlogPost.find_each(&:destroy)
4
Philip

Réponse plus récente dans le cas où vous souhaitez supprimer toutes les entrées de toutes les tables:

def reset
    Rails.application.eager_load!
    ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration  }
end

Plus d'informations sur le eager_loadici .

Après l'avoir appelé, nous pouvons accéder à tous les descendants de ActiveRecord::Base et nous pouvons appliquer un delete_all sur tous les modèles.

Notez que nous veillons à ne pas effacer la table SchemaMigration.

2
Simon Ninon

Si votre modèle s'appelle BlogPost, ce serait:

BlogPost.all.map(&:destroy)
1
stef