web-dev-qa-db-fra.com

Comment utiliser les dépendants:: détruire dans les rails?

J'ai 2 modèles comme décrit ci-dessous.

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

et

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

maintenant le problème est chaque fois que j'ai essayé de détruire un groupe, j'ai reçu une erreur comme ci-dessous.

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".

Qu'est-ce qui me manque?

26
sank

Ajoutez la suppression en cascade à votre modèle EmpGroup:

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

Ou

Appelez-vous la méthode delete? vous devez plutôt appeler destroy. Utilisation .destroy

24
Umar Khan

: dépendent est l'une des options disponibles dans l'association appartient à

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.

dans has_many associations:

: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)

tu peux essayer

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

Lorsque vous supprimez un groupe, utilisez-vous la suppression ou la destruction. - J'ai déjà eu cette erreur, et c'est parce que j'avais une faute de frappe et que j'utilisais .delete au lieu de .destroy

1
abbott567