2012-03-26 8 views
11

Ich habe folgende Modell Verbände:before_destroy und abhängig destroy Brennen nicht

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 

Wenn ich ein Slider Objekt zerstören dachte ich, die dependent => :destroy automatisch die featured_item zerstören würde, aber es funktioniert nicht.

Slider-Controller

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

So dann habe ich versucht, einen Rückruf mit before_destroy manuell die featured_item zu löschen, wenn ein Slider-Objekt zerstört wird und nichts genannt zu werden.

Wie kann ich die featured_item gelöscht werden, wenn ich ein Slider-Objekt löschen? Verwenden von Schienen 3.2.

+0

Wie löschen Sie die 'Slider'-Instanz? –

+0

zerstören def Schieber = Slider.find (params [: id]) slider.delete machen (: status =>: ok,: nichts => true) Ende – chell

Antwort

19

Sie haben gerade den Unterschied zwischen delete und destroy beobachtet. In Ihrem Controller rufen Sie

slider.delete 

, die nur eine SQL-DELETE ausführen wird, aber keine Rückrufe nicht nennen. Im Normalfall möchten Sie stattdessen destroy verwenden. Sie holt das Objekt (falls erforderlich), ruft die Callbacks einschließlich rekursiver Destroy auf und löscht das Objekt erst dann aus der Datenbank. Weitere Informationen finden Sie in der Dokumentation zu delete und destroy.

+0

Geez, auch zur Kenntnis genommen. Ich dachte immer, man sei ein Alias ​​des anderen. Vielen Dank. –

4

Stellen Sie sicher, dass Sie Slider#destroy anrufen, um Rückrufe auszulösen. Slider#delete wird einfach den Datensatz löschen, ohne sie aufzurufen.

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

class FeaturedHappening < ActiveRecord::Base 
    belongs_to :featured_item 
end 

Wenn Ihr Code einfach wie oben war, in dem es eine einfache Beziehung gibt. Nach dem Löschen des Schiebereglers wird Feature Happing mit dem Löschen des Schiebereglers gelöscht. Aber in Ihrem Fall ist die Beziehung polymorph. In der Feature-Happing-Tabelle in DB ist die abject_id die ID des Sliders oder eine andere Klasse. Daher das abhängige: zerstören funktioniert nicht. Sie sollten es also mit dem Rückruf vor dem Rückruf löschen, in dem Sie die Datensätze zuerst abrufen und dann löschen.