Comment supprimer un élément associé à HABTM sans supprimer l’élément lui-même?
Par exemple, disons que j’ai trois étudiants qui sont en classe de sciences ensemble. Comment supprimer les objects Science de la table StudentsClasses sans supprimer la référence Science actuelle? Je suppose que Student.Classes.first.delete
n’est pas une bonne idée.
J’utilise JavaScript avec glisser-déposer pour append et supprimer, pas pour cocher les cases. Des pensées?
J’ai tendance à utiliser has_many: through, mais as-tu essayé
student.classes.delete(science)
Je pense que la nécessité d’avoir l’object cible, pas seulement 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 obtenez 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 “Class” est une très mauvaise idée. Utilisez un nom qui ne fait pas partie du kernel de Ruby!
Si vous souhaitez supprimer plusieurs éléments associés, vous pouvez utiliser *
et écrire:
student.classes.delete(*classes_array)