【问题标题】:Rails: How to use dependent: :destroy in rails?Rails:如何在rails中使用dependent::destroy?
【发布时间】:2015-04-10 11:54:40
【问题描述】:

我有 2 个模型,如下所述。

class EmpGroup < ActiveRecord::Base
  belongs_to :user
  has_many :emp_group_members, dependent: :destroy
end

class EmpGroupMember < ActiveRecord::Base
  belongs_to :emp_group
  belongs_to :user
end

现在的问题是,每当我尝试销毁一个组时,我都会收到如下错误。

PG::ForeignKeyViolation: ERROR:  update or delete on table "emp_groups" violates foreign key constraint "fk_rails_bd68440021" on table "emp_group_members"
DETAIL:  Key (id)=(1) is still referenced from table "emp_group_members".

我错过了什么?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2


    【解决方案1】:

    将级联删除添加到您的 EmpGroup 模型:

    class EmpGroup < ActiveRecord::Base
       has_many :emp_group_members, dependent: :delete_all
    end
    

    或者

    你是在调用delete 方法吗?你应该打电话给destroy。 使用.destroy

    【讨论】:

    • 注意:使用destroy而不是delete非常重要,因为万一所属模型(在这种情况下:emp_group_member)有进一步的关联,或者在任何情况下,emp_group_member的destroy方法都不会被调用和删除只会删除第一个孩子。如果您希望销毁级联直到结束,请添加dependent::destroy。 @Milind 的回答对理解这一点很有帮助。
    【解决方案2】:

    :dependentbelongs_to 关联中可用的选项之一

    If you set the :dependent option to:
    
    :destroy, when the object is destroyed, destroy will be called on its associated objects.
    :delete, when the object is destroyed, all its associated objects will be deleted directly from the database without calling their destroy method.
    

    Additionally, objects will be destroyed if they're associated with dependent: :destroy, and deleted if they're associated with dependent::delete_all.

    在 has_many 关联中:

    :destroy causes all the associated objects to also be destroyed
    :delete_all causes all the associated objects to be deleted directly from the database (so callbacks will not execute)
    

    你可以试试

     emp_member_1= @emp_group.emp_group_members.first
     ##delete associated record
     @emp_group.emp_group_members.delete(emp_member_1)
    

    【讨论】:

    • 来自文档:“您不应在与其他类的 has_many 关联连接的 belongs_to 关联上指定此选项。这样做可能会导致数据库中的孤立记录。” (guides.rubyonrails.org/…)
    • 当然,这在文档中,但它是什么意思?
    • 他们警告我们不要做……某事。但目前尚不清楚那是什么东西。我是将dependent: destroy 放在has_many 一侧还是belongs_to 一侧?这个选项的全部意义在于避免孤立记录,那么为什么它的其中一种用法会导致孤立记录呢?
    • @AndrewKoster,这是警告 -> 这样做可能会导致数据库中出现孤立记录 - 这意味着您可能会删除用户但用户 has_many 朋友仍将存在于数据库中,从而造成不一致狩猎到一个美好的一天:)。所以逻辑上,如果用户有_many朋友,那么与用户一起,他的朋友记录也应该被删除,上面的:依赖出现在图片中。希望现在清楚。
    • 我不明白的部分是为什么他们说不要在belongs_to 端使用dependent: destroy。如果它不起作用,为什么他们允许它作为一个选项?
    【解决方案3】:

    新语法:

    class EmpGroup < ActiveRecord::Base
       has_many :emp_group_members, dependent: :destroy
    end
    

    【讨论】:

      【解决方案4】:

      当您删除组时,您使用的是删除还是销毁。 - 我以前遇到过这个错误,这是因为我有一个错字并且使用的是 .delete 而不是 .destroy

      【讨论】:

        【解决方案5】:

        像这样插入关系

        has_many :children, :dependent => :destroy
        

        要了解有关销毁和删除的更多信息,请访问此链接 https://medium.com/@wkhearn/delete-vs-destroy-does-it-even-matter-8cb4db6aa660

        【讨论】:

          猜你喜欢
          • 2011-02-17
          • 2011-08-28
          • 2023-03-14
          • 1970-01-01
          • 2016-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多