如何使用依赖::在rails中销毁?

san*_*ank 28 ruby ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 ruby-on-rails-4

我有2个型号,如下所述.

class EmpGroup < ActiveRecord::Base
  belongs_to :user
  has_many :emp_group_members, dependent: :destroy
end
Run Code Online (Sandbox Code Playgroud)

class EmpGroupMember < ActiveRecord::Base
  belongs_to :emp_group
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

现在问题是每当我试图销毁一个组然后我收到如下错误.

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".
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Uma*_*han 25

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

class EmpGroup < ActiveRecord::Base
   has_many :emp_group_members, :dependent => :delete_all
end
Run Code Online (Sandbox Code Playgroud)

要么

你在打电话delete吗?你应该打个电话destroy.使用.destroy

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

Mil*_*ind 16

: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.
Run Code Online (Sandbox Code Playgroud)

Additionally, objects will be destroyed if they're associated with dependent: :destroy, and deleted if they're associated with dependent: :删除所有.

在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)
Run Code Online (Sandbox Code Playgroud)

你可以试试

 emp_member_1= @emp_group.emp_group_members.first
 ##delete associated record
 @emp_group.emp_group_members.delete(emp_member_1)
Run Code Online (Sandbox Code Playgroud)

  • 从文档中:"您不应该在与另一个类上的has_many关联相关联的belongs_to关联上指定此选项.这样做会导致数据库中的孤立记录." (https://guides.rubyonrails.org/association_basics.html#options-for-belongs-to-dependent) (2认同)

Tho*_*der 7

新语法:

class EmpGroup < ActiveRecord::Base
   has_many :emp_group_members, dependent: :destroy
end
Run Code Online (Sandbox Code Playgroud)