如何在不删除项目本身的情况下删除单个HABTM关联项目?

时间:2009-07-07 00:53:21

标签: ruby-on-rails associations has-and-belongs-to-many

如何在不删除项目本身的情况下删除HABTM关联项目?

例如,假设我有3名学生一起参加科学课程。如何从StudentsClasses表中删除Science对象而不删除实际的Science参考?我猜测Student.Classes.first.delete不是个好主意。

我正在使用带拖放的JavaScript来添加和删除,而不是复选框。有什么想法吗?

2 个答案:

答案 0 :(得分:58)

我倾向于使用has_many:through,但你试过吗

student.classes.delete(science)

我认为需要拥有目标对象,而不仅仅是ID,是HABTM的限制(因为为方便起见,连接表被抽象出来)。如果您使用has_many:through,您可以直接在连接表上操作(因为您获得了一个模型),并且可以将此类事物优化为更少的查询。

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)

另外,调用模型“Class”是一个非常糟糕的主意。使用不属于Ruby核心的名称!

答案 1 :(得分:0)

如果要删除多个关联项,可以使用*并写入:

student.classes.delete(*classes_array)