ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2

ruby on rails - ¿Cómo utilizar dependiente:: destruir en los carriles?



ruby-on-rails ruby-on-rails-3 (3)

Agregue la eliminación en cascada a su modelo de EmpGroup:

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

O

¿Estás llamando a delete método? deberías llamar a destroy lugar. Usa .destroy

Tengo 2 modelos como se describe a continuación.

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

y

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

Ahora el problema es que cuando intenté destruir un grupo, recibí un error como se muestra a continuación.

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é me estoy perdiendo?


Cuando eliminas un grupo, estás usando eliminar o destruir. - He tenido este error antes, y fue porque tenía un error tipográfico y estaba usando .delete en lugar de .destroy


:dependent es una de las opciones disponibles en participación para asociación

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.

en has_many asociaciones:

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

puedes probar

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