¿Cómo se elimina un objeto ActiveRecord?

328

¿Cómo se elimina un objeto ActiveRecord?

Observé la consulta de registros activos y no puedo ver nada sobre la eliminación.

  1. Eliminar por id,

  2. Eliminar el objeto seleccionado como: user.remove,

  3. ¿Se puede eliminar en función de una wherecláusula?

Blankman
fuente

Respuestas:

572

Es destroyy destroy_allmétodos, como

user.destroy
User.find(15).destroy
User.destroy(15)
User.where(age: 20).destroy_all
User.destroy_all(age: 20)

Alternativamente, puede utilizar deletey delete_allque no va a cumplir :before_destroyy :after_destroydevoluciones de llamada o cualquier opción de asociación dependientes.

User.delete_all(condition: 'value') le permitirá eliminar registros sin una clave primaria

Nota : según el comentario de @ hammady, user.destroyno funcionará si el modelo de usuario no tiene clave principal.

Nota 2 : Del comentario de @ pavel-chuchuva, destroy_allcon condiciones y delete_allcon condiciones ha quedado en desuso en Rails 5.1 - ver guías.rubyonrails.org/5_1_release_notes.html

Marek Sapota
fuente
44
Sería bueno si pudieras incluir el comentario de @ hammady en tu respuesta. Luchado para averiguar por qué no podía destruir mi objeto de modelo ...
the_critic
¿Por qué solo actualiza los datos de la columna delete_at en mi base de datos? ¿Cómo puedo eliminar toda la fila de datos?
TommyQu
1
destroy_all con condiciones y delete_all con condiciones ha quedado en desuso en Rails 5.1 - ver guías.rubyonrails.org
Pavel Chuchuva
Esto también User.find_by(username:"bob") es bueno para identificar el registro que se va a destruir o eliminar.
barlop 01 de
60

Hay delete, delete_all, destroy, y destroy_all.

Los documentos son: documentos antiguos y documentos de Rails 3.0.0

deleteno instancia los objetos, mientras que lo destroyhace. En general, deletees más rápido que destroy.

nonopolaridad
fuente
44
deletees más rápido pero evita las devoluciones de llamada que podría haber definido en el modelo
Rudi
48
  1. User.destroy

User.destroy(1)eliminará usuario con id == 1y :before_destroyy :after_destroyse producen devoluciones de llamada. Por ejemplo, si tiene registros asociados

has_many :addresses, :dependent => :destroy

Después de que el usuario sea destruido, sus direcciones también serán destruidas. Si utiliza la acción de eliminación en su lugar, no se realizarán devoluciones de llamada.

  1. User.destroy, User.delete

  2. User.destroy_all(<conditions>) o User.delete_all(<conditions>)

Aviso : el usuario es una clase y el usuario es un objeto de instancia

Tadas T
fuente
3
Gracias por abordar los registros asociados.
Sage Mitchell
2
CUIDADO: User.destroy_all()ejecuta devoluciones de llamada, por lo que antes de eliminar cualquier cosa, carga registros. Son dos sentencias SQL, no una. Además de las implicaciones de rendimiento, esto también tiene implicaciones de concurrencia. La llamada más segura omite las devoluciones de llamada; User.delete_all()emitirá un solo DELETE FROM...comando.
Andrew Hodgkinson
1
destroy_all con condiciones ha quedado en desuso en Rails 5.1 - ver guías.rubyonrails.org
Pavel Chuchuva