Comment puis-je supprimer tous les enregistrements de l'une de mes tables de base de données dans une Ruby sur Rails app?
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).
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
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
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)
BlogPost.find_each(&:destroy)
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_load
ici .
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.
Si votre modèle s'appelle BlogPost, ce serait:
BlogPost.all.map(&:destroy)