如何在不删除项目本身的情况下删除单个 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? [复制]
如何在不重新启动的情况下卸载 Windows 服务并删除其文件