2009-08-18 15 views

Respuesta

40

Puede hacer esto.

Record.exists?(record) 

Sin embargo, eso hará un golpe en la base de datos que no es realmente necesario. La única otra solución que conozco es hacer una devolución de llamada como lo mencionó el IV.

attr_accessor :destroyed 
after_destroy :mark_as_destroyed 
def mark_as_destroyed 
    self.destroyed = true 
end 

Y luego marque record.destroyed.

+2

Creo que algún contexto es útil aquí. Depende de por qué quieres saber si un objeto ha sido destruido. Si lo haces como parte de una prueba unitaria, entonces el golpe extra contra la base de datos está bien. Si lo haces como parte de la aplicación, entonces la segunda ruta podría ser una mejor opción. – jerhinesmith

+49

Esto ya no es necesario, use 'object.destroyed?' – Rob

+0

http://stackoverflow.com/a/3462595/850996 es la respuesta correcta –

0

Sin saber más sobre la lógica de su aplicación, ¿creo que está congelada? es tu mejor apuesta.

En caso de que así sea, podría agregar un atributo "destruido" a los modelos que active en las devoluciones de llamada y que podría verificarse si desea una solución más precisa.

4

destroy ing un objeto no devuelve nada más que una llamada a freeze (hasta donde yo sé) así que creo que frozen? es su mejor opción. Su otra opción es rescatar de ActiveRecord::RecordNotFound si hizo algo como record.reload.

Creo que la táctica de Mike anterior podría ser la mejor, o podría escribir un envoltorio para estos casos mencionados si quiere comenzar a 'hacer suposiciones'.

Saludos.

+0

¿Actualmente solo reviso congelado ?, pero realmente puedo cargar algo y congelarlo para algún otro propósito, y sería una mentira, entonces ... En la situación actual, congelado? funciona bien, pero no quiero confiar en él a largo plazo. –

10

Esto viene muy pronto. En la última Riding Rails puesto, que dice lo siguiente:

Y, por último, que no es necesariamente relacionado con el BugMash , pero José Valim - entre docenas de otras confirmaciones - añadió model.destroyed ?. Este ingenioso método se devolverá verdadero solo si la instancia que está examinando ha sido destruida satisfactoriamente.

Así que listo. ¡Próximamente!

166

Just Do It:

record.destroyed? 

detalles están aquí ActiveRecord::Persistence

+0

Es parte del módulo ActiveRecord :: Persistence: http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html –

+0

@Kevin: ¡Gracias! He actualizado mi respuesta. Todo cambia a medida que pasa el tiempo :) – Voldy

4

Mientras record.destroyed? funciona bien, y devuelve verdadero o falso, también puedes SECAR esto un poco y crear la condición if en la línea que llamas destruir en tu controlador.

record = Object.find(params[:id]) 
if record.destroy 
    ... happy path 
else 
    ... sad path 
end 

Date cuenta de que esta publicación es un poco tardía en el juego.Pero si alguien quiere discutir esto más, ¡estoy listo! Nota al margen: también tuve una validación after_destroy en mi modelo y mientras funcionaba, un método separado para algo como esto parece excesivo;)

Cuestiones relacionadas