2009-09-09 4 views
47

Anscheinend abhängig => zerstören wird ignoriert, wenn auch die: through-Option.dependent => zerstören auf eine "has_many through" Verbindung

So habe ich diese ...

class Comment < ActiveRecord::Base 
    has_many :comment_users, :dependent => :destroy 
    has_many :users, :through => :comment_users 
    ... 
end 

... aber einen Kommentar zu löschen führt nicht in den zugehörigen comment_user Datensätze gelöscht zu werden.

Was ist der empfohlene Ansatz für Kaskadenlöschungen bei Verwendung von: through?

Danke

Antwort

96

Anscheinend: abhängig wird nicht ignoriert!

Das eigentliche Problem war, dass ich Comment.delete(id) rief die direkt zum db geht, während ich jetzt Comment.destroy(id) verwenden, die den Kommentar Objekt lädt und Anrufe destroy() auf sie. Dies nimmt die :dependent => :destroy und alles ist gut.

+0

der Tat! Ich hatte ein ähnliches Problem, außer dass ich Fremdschlüsselfehler bekam, obwohl ich "abhängig:: destroy" verwendete. Problem war, dass ich "obj.delete" anstelle von "obj.destroy" verwendete, damit die Abhängigen nicht gelöscht wurden, also der Integritätsfehler. –

11

Die Lösung des ursprünglichen Posters ist gültig, ich möchte jedoch darauf hinweisen, dass dies nur funktioniert, wenn Sie eine ID-Spalte für diese Tabelle haben. Ich bevorzuge meine Viele-zu-Viele-Tabellen, um nur die zwei Fremdschlüssel zu sein, aber ich musste meine "id: false" aus der Migrationstabellendefinition für kaskadierendes Löschen entfernen, um zu arbeiten. Diese Funktionalität hat definitiv Vorrang vor dem Fehlen einer ID-Spalte auf dem Tisch.

+0

Danke! Ich habe gerade einen halben Tag damit verbracht, das herauszufinden. – Tintin81

+2

du bist echt mvp – jed

5

Wenn Sie eine polymorphe Vereinigung haben, sollten Sie das tun, was die @blogofsongs aber mit einem foreign_key Attribut wie folgt:

class User < ActiveRecord::Base 
    has_many :activities , dependent: :destroy, foreign_key: :trackable_id 
end 
Verwandte Themen