Eliminar todos los registros en una tabla de base de datos

Respuestas:

249

Si está buscando una manera de hacerlo sin SQL, debería poder usar delete_all.

Post.delete_all

o con un criterio

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

Ver aquí para más información.

Los registros se eliminan sin cargarlos primero, lo que lo hace muy rápido, pero romperá la funcionalidad como el caché del contador que depende del código de rieles que se ejecutará al eliminarlo.

HakonB
fuente
13
Vale la pena señalar que si tiene asociaciones con: dependiente =>: destruir, o cualquier cosa que deba limpiarse una vez eliminada, probablemente desee Post.destroy_all, aunque es mucho más lento. Ver apidock.com/rails/ActiveRecord/Base/destroy_all/class
Michael Hellein
Esta respuesta supone que la tabla tiene un modelo asociado. El OP no especificó esto: ¿qué sucede si la tabla es una tabla de unión?
Toby 1 Kenobi
1
@BradWerth, ya sea que algunos lo consideren un buen o mal estilo, solo digo que es factible que un Rails db tenga tablas que no sean ActiveRecordmodelos. La pregunta se refiere a eliminar el registro de una 'tabla' y solo estoy señalando o la suposición contenida en la respuesta.
Toby 1 Kenobi
Tengo la misma consulta que la de @ Toby1Kenobi.
nbsamar
30

Para eliminar a través de SQL

Item.delete_all # accepts optional conditions

Para eliminar llamando al método de destrucción de cada modelo (costoso pero asegura que se llamen las devoluciones de llamada)

Item.destroy_all # accepts optional conditions

Todos aqui

Lebreeze
fuente
21

si desea vaciar completamente la base de datos y no solo eliminar un modelo o modelos adjuntos, puede hacer lo siguiente:

rake db:purge

también puedes hacerlo en la base de datos de prueba

rake db:test:purge
KensoDev
fuente
5

Si te refieres a eliminar cada instancia de todos los modelos, usaría

ActiveRecord::Base.connection.tables.map(&:classify)
  .map{|name| name.constantize if Object.const_defined?(name)}
  .compact.each(&:delete_all)
dfaulken
fuente
1
Prefiere selectsiempre que necesites usar una expresión if dentro de un bloque, de esta manera evitas tener que encadenar el método compacto para eliminar elementos nulos.
Sebastian Palma
4
BlogPost.find_each(&:destroy)
Philip
fuente
Esto es genial para circunstancias de poca memoria.
Epigene
Esta es la única respuesta que tiene en cuenta el consumo de memoria.
John
2
Omg, por qué hacer un bucle para esto ... no tiene sentido. simplemente elimine todos los registros DELETE FROM table, Model.delete_all
Imnl
@John ¿por qué una sola consulta consume más memoria que un bucle de consultas?
Imnl
@Imnl Cada iteración crea una instancia nueva del modelo en cuestión para que pueda procesar las devoluciones de llamada para el método de eliminación.
John
2

Si su modelo se llama BlogPost, sería:

BlogPost.all.map(&:destroy)
stef
fuente
esto buscará cada BlogPost y lo cargará en una matriz Ruby antes de destruirlos.
hdgarrood
Depende del ORM. Datamapper no haría eso porque no está solicitando nada sobre cada modelo. Y aquí hay un seguimiento de pila Mongoid que muestra que no selecciona ningún campo antes de destruir cada entrada:MOPED: 127.0.0.1:27017 QUERY database=a_database collection=nothings selector={} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.3378ms)
stef
44
Dado que es una pregunta de rieles, y el autor de la pregunta no ha dicho qué ORM está usando, debemos asumir ActiveRecord
hdgarrood
2

Respuesta más reciente en el caso de que desee eliminar todas las entradas en cada tabla:

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

Más información sobre el eager_load aquí .

Después de llamarlo, podemos acceder a todos los descendientes de ActiveRecord::Basey podemos aplicar a delete_allen todos los modelos.

Tenga en cuenta que nos aseguramos de no borrar la tabla SchemaMigration.

Simon Ninon
fuente