2012-03-26 17 views
11

Tengo las siguientes asociaciones de modelos:before_destroy y dependiente no destruye disparar

class Slider < ActiveRecord::Base 
    has_one :featured_happening, :as => :featured_item, :dependent => :destroy 
    before_destroy :destroy_featured_happening 
    after_create :create_featured_happening 
end 

class FeaturedHappening < ActiveRecord::Base 
    belongs_to :featured_item, :polymorphic => true 
end 

Cuando destruya un objeto Slider yo pensamos que el dependent => :destroy destruiría automáticamente el featured_item pero no es así.

controlador deslizante

def destroy  
    slider = Slider.find(params[:id]) 
    slider.delete 
    render(:status => :ok, :nothing => true) 
    end 

Entonces me trataron con una devolución de llamada before_destroy eliminar manualmente el featured_item cuando un objeto deslizante se destruye y nada está recibiendo llamadas.

¿Cómo puedo eliminar el featured_item cuando elimino un objeto deslizante? Usando Rails 3.2.

+0

¿Cómo se borra la instancia 'Slider'? –

+0

def destroy deslizador = Slider.find (params [: id]) slider.delete render (: estado =>: ok,: nada => true) final – chell

Respuesta

19

Acaba de observar la diferencia entre delete y destroy. En su controlador se llama

slider.delete 

que sólo hay que ejecutar un SQL DELETE pero no va a llamar a cualquier devoluciones de llamada. Es por eso que, en casos normales, quiere usar destroy en su lugar. Traerá el objeto (si es necesario), llamará a las devoluciones de llamadas, incluyendo las destruidas recursivas y solo luego borrará el objeto de la base de datos. Para obtener más información, consulte la documentación de delete y destroy.

+0

Caray, así se indique. Siempre pensé que uno era un alias del otro. Gracias. –

4

Asegúrese de llamar al Slider#destroy para activar las devoluciones de llamada. Slider#delete simplemente borrará el registro sin llamarlos.

0
class Slider < ActiveRecord::Base 
    has_one :featured_happening, :dependent => :destroy 
end 

class FeaturedHappening < ActiveRecord::Base 
    belongs_to :featured_item 
end 

Si su código era simple como el anterior en el que existe una relación simple. Luego, con la eliminación del control deslizante, se eliminará Feature Happing con la eliminación del control deslizante. Pero en tu caso, la relación es polimórfica. En la tabla de asignación de funciones en DB, abject_id será el id del control deslizante o puede ser alguna otra clase. Por lo tanto, el dependiente: destruir no funciona. Por lo tanto, debe eliminarlo con la devolución de llamada before_destroy en la que primero recupera los registros y luego los destruye

Cuestiones relacionadas