2009-07-07 16 views
39

¿Cómo se elimina un elemento asociado HABTM sin eliminar el elemento en sí?¿Cómo elimino un solo elemento asociado HABTM sin eliminar el elemento en sí?

Por ejemplo, supongamos que tengo 3 estudiantes que están en una clase de ciencias juntos. ¿Cómo elimino los objetos Science de la tabla StudentsClasses sin eliminar la referencia real de Science? Supongo que Student.Classes.first.delete no es una buena idea.

Estoy usando JavaScript con arrastrar y soltar para agregar y eliminar, no marcar casillas de verificación. ¿Alguna idea?

Respuesta

57

que tienden a utilizar has_many: a través de, pero ¿ha tratado

student.classes.delete(science) 

Creo que la necesidad de tener el objeto de destino, no sólo la identificación, es una limitación de HABTM (ya que la tabla de unión se abstrae por su conveniencia). Si usa has_many: through puede operar directamente en la tabla de unión (ya que obtiene un Modelo) y eso le permite optimizar este tipo de cosas en menos consultas.

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

Si desea que la simplicidad de HABTM es necesario utilizar

student.classes.delete(Class.find 2) 

También, llamando a un modelo de "clase" es una muy mala idea. ¡Usa un nombre que no forme parte del núcleo de Ruby!

+0

bien la forma en que está configurado actualmente, debo utilizar params [: id_clase] para realizar Class.find_by_id a continuación, utilizar el encontró clase para hacer eso. Sería bueno si pudiera decir "Student.class_ids.remove [2]". –

+0

Ese es el tipo de creo que necesitas has_many: for for. Actualizado la respuesta para reflejar eso. –

0

Si desea eliminar varios elementos asociados que se pueden utilizar * y escribir:

student.classes.delete(*classes_array) 
Cuestiones relacionadas