2009-07-07 6 views
39

Jak usunąć powiązany z HABTM element bez usuwania samego elementu?Jak usunąć pojedynczy element powiązany z HABTM bez usuwania samego elementu?

Załóżmy na przykład, że mam 3 studentów, którzy są razem w klasie Science. Jak usunąć obiekty Science z tabeli StudentsClasses bez usuwania faktycznego odniesienia do Science? Zgaduję, że Student.Classes.first.delete nie jest dobrym pomysłem.

Używam JavaScript z drag-and-drop do dodawania i usuwania, nie zaznaczam pól. jakieś pomysły?

Odpowiedz

57

I mają tendencję do używania has_many: through, ale czy próbowałeś

student.classes.delete(science) 

Myślę, która chciałaby mieć obiekt docelowy, a nie tylko identyfikator, jest to ograniczenie HABTM (ponieważ tabela przyłączyć są wydobywane z dala dla wygody). Jeśli używasz has_many: możesz operować bezpośrednio na tabeli sprzężenia (ponieważ otrzymujesz Model) i to pozwala zoptymalizować tego rodzaju rzeczy w mniejszej liczbie zapytań.

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

Jeśli chcesz prostotę HABTM trzeba użyć

student.classes.delete(Class.find 2) 

Ponadto, nazywając model "Klasa" to naprawdę zły pomysł. Użyj nazwy, która nie jest częścią rdzenia Ruby!

+0

No tak to jest obecnie skonfigurowana, muszę korzystać params [: class_id], aby wykonać Class.find_by_id następnie użyj znaleźć klasę, która to zrobi. Byłoby miło, gdybym mógł po prostu powiedzieć "Student.class_ids.remove [2]". –

+0

Tego rodzaju myślę, że potrzebujesz has_many: through for for. Zaktualizowano odpowiedź, aby to odzwierciedlić. –

0

Jeśli chcesz usunąć wiele powiązanych elementów można użyć * i napisać:

student.classes.delete(*classes_array) 
Powiązane problemy