web-dev-qa-db-fra.com

Comment supprimer un seul élément associé à HABTM sans le supprimer lui-même?

Comment supprimer un élément associé à HABTM sans le supprimer lui-même?

Par exemple, supposons que trois étudiants suivent un cours de sciences ensemble. Comment supprimer les objets Science de la table StudentsClasses sans supprimer la référence Science réelle? Je suppose que Student.Classes.first.delete n'est pas une bonne idée.

J'utilise JavaScript avec glisser-déposer pour ajouter et supprimer, pas des cases à cocher. Des pensées?

40
humble_coder

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

student.classes.delete(science)

Je pense qu'avoir besoin de l'objet cible, et pas seulement de l'ID, est une limitation de HABTM (puisque la table de jointure est extraite pour votre commodité). Si vous utilisez has_many: through, vous pouvez opérer directement sur la table de jointure (puisque vous avez un modèle) et cela vous permet d'optimiser ce genre de choses 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, appeler un modèle "Classe" est une très mauvaise idée. Utilisez un nom qui ne fait pas partie du noyau de Ruby!

58
Michael Sofaer

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

student.classes.delete(*classes_array)
0
GEkk