2009-07-07 9 views
39

Comment supprimer un élément associé à HABTM sans supprimer l'élément lui-même? Par exemple, disons que j'ai 3 étudiants qui sont dans une classe de sciences ensemble. Comment puis-je supprimer les objets Science de la table StudentsClasses sans supprimer la référence Science actuelle? Je devine que Student.Classes.first.delete n'est pas une bonne idée. J'utilise JavaScript avec un glisser-déposer pour ajouter et supprimer, et non des cases à cocher. Des pensées?Comment supprimer un seul élément associé à HABTM sans supprimer l'élément lui-même?

Répondre

57

J'ai tendance à utiliser has_many: à travers, mais avez-vous essayé

student.classes.delete(science) 

Je pense avoir besoin de l'objet cible, non seulement l'ID, est une limitation de HABTM (depuis est extrait loin de la table de jointure Pour ta convenance). Si vous utilisez has_many: through vous pouvez opérer directement sur la table join (puisque vous obtenez un Model) et cela vous permet d'optimiser ce genre de chose en moins de requêtes.

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

Si vous voulez la simplicité de HABTM vous devez utiliser

student.classes.delete(Class.find 2) 

Aussi, appelle un modèle « classe » est une très mauvaise idée. Utilisez un nom qui ne fait pas partie du noyau de Ruby!

+0

Eh bien la façon dont il est actuellement mis en place, je dois utiliser params [: class_id] pour effectuer Class.find_by_id puis utilisez la trouvé classe pour le faire. Ce serait bien si je pouvais juste dire "Student.class_ids.remove [2]". –

+0

C'est le genre de réflexion dont vous avez besoin has_many: à travers pour. Mise à jour de la réponse pour refléter cela. –

0

Si vous souhaitez supprimer plusieurs éléments associés que vous pouvez utiliser * et écrire:

student.classes.delete(*classes_array)