2012-04-04 14 views
0

Meine has_many: durch Assoziationen auf Releases/Produkte/Tracks scheinen die Verfolgen und verwaiste Zuordnungen in den releases_tracks/products_tracks Tabellen zu löschen. Ich kann nicht sehen, wo ich falsch gelaufen bin. Ich dachte, das Standardverhalten wäre, nur die Verknüpfung zu löschen. Kann mir bitte jemand helfen?Warum funktionieren meine has_many: through-Assoziationen beim Löschen nicht korrekt?

Meine Models:

class Track < ActiveRecord::Base 
    has_many :releases_tracks 
    has_many :tracks, :through => :releases_tracks 

    has_many :products_tracks 
    has_many :products, :through => :products_tracks 
end 

class Release < ActiveRecord::Base 
    has_many :releases_tracks 
    has_many :tracks, :through => :releases_tracks 
end 

class Product < ActiveRecord::Base 
    has_many :products_tracks 
    has_many :tracks, :through => :products_tracks 
    before_save do 
    self.track_ids = self.releases_track_ids 
    end 
end 

class ProductsTrack < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :track 
end 

class ReleasesTrack < ActiveRecord::Base 
    belongs_to :release 
    belongs_to :track 
end 

My Track-Controller (für die Aktion zerstören):

class TracksController < ApplicationController 
    before_filter :get_track_parent 

def destroy 
    @track = @parent.tracks.find(params[:id]) 
    @track.destroy 
    redirect_to @parent 
end 

private 

def get_track_parent 
    if params[:product_id].present? 
    @parent = Product.find(params[:product_id]) 
    elsif params[:release_id].present? 
    @parent = Release.find(params[:release_id]) 
    end 
end 
end 

Mein Link in den Versionen zerstören anzuzeigen:

<%= link_to image_tag("icons/delete.png"), release_track_path(@release,track), :confirm => 'Are you sure?', :method => :delete %> 

Und schließlich meine Link in der Produktansicht zerstören:

<%= link_to image_tag("icons/delete.png"), product_track_path(@product,track), :confirm => 'Are you sure?', :method => :delete %> 
+0

Du brauchst vielleicht ': dependent =>: destroy' auf der Assoziation Bsp:' has_many: products,: through =>: products_tracks,: dependent =>: destroy' – VelLes

+0

Werde es versuchen, danke. – Raoot

+0

Angst, dass es nicht löst. – Raoot

Antwort

1

Zunächst einmal müssen Sie :dependent => :destroy Option für Ihre Verbände:

class Track < ActiveRecord::Base 
    has_many :releases_tracks, :dependent => :destroy 
    has_many :releases, :through => :releases_tracks # also note you had here :tracks instead of :releases 

    has_many :products_tracks, :dependent => :destroy 
    has_many :products, :through => :products_tracks 
end 

Und auch, wenn Sie Spuren wollen entfernt werden, wenn Versionen oder Produkte zu entfernen, fügen Sie folgende :dependent => :destroy s:

class Release < ActiveRecord::Base 
    has_many :releases_tracks, :dependent => :destroy 
    has_many :tracks, :through => :releases_tracks 
end 

class Product < ActiveRecord::Base 
    has_many :products_tracks, :dependent => :destroy 
    has_many :tracks, :through => :products_tracks 
    before_save do 
    self.track_ids = self.releases_track_ids 
    end 
end 

class ProductsTrack < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :track, :dependent => :destroy 
end 

class ReleasesTrack < ActiveRecord::Base 
    belongs_to :release 
    belongs_to :track, :dependent => :destroy 
end 
+0

Danke, endlich mit diesem jetzt voran! Ich habe hinzugefügt: dependent =>: zerstöre wie in meinem Tracks-Modell angegeben und jetzt wird die Assoziation zusammen mit dem Track gelöscht, ich möchte jedoch nur die Assoziationen löschen und den Track in der Datenbank belassen. – Raoot

+0

Kann immer noch nur die Assoziationen hier löschen, kann jemand eine Anleitung geben? – Raoot

+0

Könnten Sie bitte Ihr Problem deutlicher erklären? Kannst du Code von dem, was du versuchst, angeben? –

Verwandte Themen