2009-07-07 4 views
39

Как удалить связанный элемент HABTM без удаления самого элемента?Как удалить один связанный элемент HABTM без удаления самого элемента?

Например, скажем, у меня есть 3 ученика, которые находятся в классе науки вместе. Как удалить объекты Science из таблицы StudentsClasses, не удаляя фактическую ссылку Science? Я предполагаю, что Student.Classes.first.delete это не очень хорошая идея.

Я использую JavaScript с перетаскиванием для добавления и удаления, а не флажков. Есть предположения?

ответ

57

Я предпочитаю использовать has_many: через, но вы пробовали

student.classes.delete(science) 

Я думаю, необходимости иметь целевой объект, а не только ID, это ограничение HABTM (так как присоединиться таблица абстрагируются для вашего удобства). Если вы используете has_many: вы можете напрямую работать с таблицей соединений (так как вы получаете модель), и это позволяет вам оптимизировать подобные вещи на меньшее количество запросов.

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

Если вы хотите простоту HABTM вам нужно использовать

student.classes.delete(Class.find 2) 

Кроме того, вызов модели «Класс» действительно плохая идея. Используйте имя, которое не является частью ядра Ruby!

+0

Ну как это в настоящее время установлено, я должен использовать Params [: class_id], чтобы выполнить Class.find_by_id затем использовать нашел класс для этого. Было бы неплохо, если бы я мог просто сказать «Student.class_ids.remove [2]». –

+0

Это то, что вам нужно has_many: through for. Обновленный ответ, чтобы отразить это. –

0

Если вы хотите удалить несколько связанных элементов, которые можно использовать * и написать:

student.classes.delete(*classes_array)