Ответ 1
Я использую has_many: через, но вы пробовали
student.classes.delete(science)
Я думаю, что для целевого объекта, а не только для идентификатора, это ограничение 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!