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

Posted

技术标签:

【中文标题】如何在不删除项目本身的情况下删除单个 HABTM 关联项目?【英文标题】:How do I remove a single HABTM associated item without deleting the item itself? 【发布时间】:2009-07-07 00:53:20 【问题描述】:

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

例如,假设我有 3 名学生一起上科学课。如何在不删除实际科学参考的情况下从 StudentClasses 表中删除 Science 对象?我猜Student.Classes.first.delete 不是个好主意。

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

【问题讨论】:

【参考方案1】:

我倾向于使用 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)

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

【讨论】:

按照目前的设置方式,我必须使用 params[:class_id] 来执行 Class.find_by_id 然后使用找到的类来执行此操作。如果我能说“Student.class_ids.remove[2]”就好了。 这就是你需要 has_many :through 的那种想法。更新了答案以反映这一点。【参考方案2】:

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

student.classes.delete(*classes_array)

【讨论】:

以上是关于如何在不删除项目本身的情况下删除单个 HABTM 关联项目?的主要内容,如果未能解决你的问题,请参考以下文章

cakephp 在不使用视图的情况下保存 HABTM 关系的数据

如何在不从表单中删除数据的情况下重置 BootstrapValidator? [复制]

如何从 Xcode 项目中删除其中一个可可豆荚插件

如何在不重新启动的情况下卸载 Windows 服务并删除其文件

请问SAP为啥不能控制:已经审批的采购申请,在不反审批的情况下,可以被删除?

如何在不实际删除行的情况下明显折叠 Silverlight 4 ListBox 中的单行?