2012-03-26 9 views
11

Ho le seguenti associazioni modello:before_destroy e dipendente non distrugge sparare

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 

Quando ho distruggere un oggetto Slider ho pensato che il dependent => :destroy distruggerebbe automaticamente il featured_item ma non è così.

regolatore Slider

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

Allora ho provato un callback con before_destroy per eliminare manualmente il featured_item quando un oggetto cursore viene distrutto e nulla viene sempre chiamato.

Come posso cancellare lo featured_item quando elimino un oggetto di scorrimento? Utilizzo di Rails 3.2.

+0

Come si elimina l'istanza 'Slider'? –

+0

def distruggere cursore = Slider.find (params [: id]) slider.delete render (: status =>: ok,: nulla => true) fine – chell

risposta

19

È appena osservato la differenza tra delete e destroy. Nel vostro controller si chiama

slider.delete 

che sarà solo eseguire uno SQL DELETE ma non chiamare qualsiasi callback. Ecco perché in casi normali si desidera utilizzare destroy. Recupera l'oggetto (se necessario), chiama i callback inclusi i distruggenti ricorsivi e solo in seguito elimina l'oggetto dal database.

Vedere la documentazione per delete e destroy per ulteriori informazioni.

+0

Accidenti, ben nota. Ho sempre pensato che uno fosse un alias dell'altro. Grazie. –

4

Assicurarsi di chiamare Slider#destroy per attivare le richiamate. Slider#delete eliminerà semplicemente il record senza chiamarli.

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

class FeaturedHappening < ActiveRecord::Base 
    belongs_to :featured_item 
end 

Se il codice era semplice come sopra in cui esiste una relazione semplice. Quindi con la cancellazione del cursore, Feature Happing verrà eliminato con la cancellazione del cursore. Ma nel tuo caso la relazione è polimorfica. Nella feature happing table in DB abject_id sarà l'id di slider o potrebbe essere un'altra classe. Quindi il dipendente: distrugge non funziona. Così si dovrebbe necessario eliminare con callback before_destroy in cui per la prima volta recuperare i record e poi distruggerli

Problemi correlati