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

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

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

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

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 2013-05-11
      • 1970-01-01
      • 2012-11-08
      相关资源
      最近更新 更多