¿Cómo se elimina un objeto ActiveRecord?
Observé la consulta de registros activos y no puedo ver nada sobre la eliminación.
Eliminar por
id
,Eliminar el objeto seleccionado como:
user.remove
,¿Se puede eliminar en función de una
where
cláusula?
¿Cómo se elimina un objeto ActiveRecord?
Observé la consulta de registros activos y no puedo ver nada sobre la eliminación.
Eliminar por id
,
Eliminar el objeto seleccionado como: user.remove
,
¿Se puede eliminar en función de una where
cláusula?
Respuestas:
Es destroy
y destroy_all
mé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 delete
y delete_all
que no va a cumplir :before_destroy
y :after_destroy
devoluciones 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.destroy
no funcionará si el modelo de usuario no tiene clave principal.
Nota 2 : Del comentario de @ pavel-chuchuva, destroy_all
con condiciones y delete_all
con condiciones ha quedado en desuso en Rails 5.1 - ver guías.rubyonrails.org/5_1_release_notes.html
User.find_by(username:"bob")
es bueno para identificar el registro que se va a destruir o eliminar.
Hay delete
, delete_all
, destroy
, y destroy_all
.
Los documentos son: documentos antiguos y documentos de Rails 3.0.0
delete
no instancia los objetos, mientras que lo destroy
hace. En general, delete
es más rápido que destroy
.
delete
es más rápido pero evita las devoluciones de llamada que podría haber definido en el modelo
User.destroy
User.destroy(1)
eliminará usuario con id == 1
y :before_destroy
y :after_destroy
se 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.
User.destroy
, User.delete
User.destroy_all(<conditions>)
o User.delete_all(<conditions>)
Aviso : el usuario es una clase y el usuario es un objeto de instancia
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.