2009-07-07 9 views
39

Wie entfernen Sie ein HABTM-verknüpftes Element, ohne das Element selbst zu löschen?Wie entferne ich ein einzelnes HABTM-verknüpftes Element, ohne das Element selbst zu löschen?

Zum Beispiel sagen, ich habe 3 Studenten, die in einer Science-Klasse zusammen sind. Wie entferne ich die Science-Objekte aus der StudentsClasses-Tabelle, ohne die eigentliche Science-Referenz zu löschen? Ich schätze, dass Student.Classes.first.delete keine gute Idee ist.

Ich benutze JavaScript mit Drag-and-Drop zum Hinzufügen und Entfernen, nicht Kontrollkästchen. Irgendwelche Gedanken?

Antwort

57

Ich neige dazu, has_many zu verwenden: durchgehend, aber haben Sie

student.classes.delete(science) 

versuchen ich denke, um das Zielobjekt zu haben, nicht nur die ID, ist eine Beschränkung von HABTM (da die Join-Tabelle entfernt abstrahiert Für Ihren Komfort). Wenn Sie has_many: through verwenden, können Sie direkt in der Join-Tabelle arbeiten (da Sie ein Model erhalten), und Sie können so etwas in weniger Abfragen optimieren.

def leave_class(class_id) 
    ClassMembership.delete(:all, :conditions => ["student_id = ? and class_id = ?", self.id, class_id) 
end 

Wenn Sie die Einfachheit HABTM wollen, müssen Sie

student.classes.delete(Class.find 2) 

auch verwenden, wird ein Modell „Klasse“ zu nennen ist eine wirklich schlechte Idee. Verwenden Sie einen Namen, der nicht zum Kern von Ruby gehört!

+0

Gut so, wie es zur Zeit eingerichtet ist, muss ich params verwenden [: class_id] auszuführen Class.find_by_id dann die Verwendung Ich habe Klasse dafür gefunden. Es wäre schön, wenn ich einfach "Student.class_ids.remove [2]" sagen könnte. –

+0

Das ist die Art von Denken, die Sie brauchen, has_many: durch für. Die Antwort wurde aktualisiert, um das widerzuspiegeln. –

0

Wenn Sie mehrere zugeordnete Elemente löschen möchten Sie * verwenden und schreiben können:

student.classes.delete(*classes_array) 
Verwandte Themen