简体   繁体   中英

Rails dependent destroy not working

I have User and Organization model. User has_many :organizations and Organization has_many :users .

When I want to destroy user from db using @user.destroy I get error Key (id)=(3) is still referenced from table "organizations".

Here is my User and Organization models:

Organization.rb

class Organization < ApplicationRecord
  extend FriendlyId
  friendly_id :name, :use => :slugged

  has_many :members, :dependent => :destroy
  has_many :users, :through => :members, :dependent => :destroy
  has_many :moderators, -> { where :members => { :role => 1 } }, :through => :members, :source => :user
  has_many :admins, -> { where :members => { :role => 2 } }, :through => :members, :source => :user
  has_many :campains, :dependent => :destroy
  has_many :statuses, :as => :statusable
  has_many :activities
  has_many :world_members
  has_many :teams

  accepts_nested_attributes_for :members, :users

User.rb

class User < ApplicationRecord
  extend FriendlyId
  friendly_id :full_name, :use => :slugged
  acts_as_voter

  enum role: [:user, :moderator, :organization, :admin]

  has_many :members, :class_name => "Member", :foreign_key => "user_id", :dependent => :destroy
  has_many :organizations, :through => :members, :dependent => :destroy
  has_many :conversations, :foreign_key => :sender_id

  has_many :admin_organizations, ->{ where(members: {role: 2}) }, :through => :members, source: :organization
  has_many :moderate_organizations, ->{ where(members: {role: 1}) }, :through => :members, source: :organization
  has_many :member_organizations, ->{ where(members: {role: 0}) }, :through => :members, source: :organization

  accepts_nested_attributes_for :members, :organizations

Member.rb

class Member < ApplicationRecord
  enum role: [:member, :moderator, :admin]
  belongs_to :user
  belongs_to :organization

You should not have dependent_destroy for :organizations or :users , just for :members .

You do not have direct relation from organization to user, nor from user to organization.

class User < ActiveRecord::Base
  has_many :members, dependent: :destroy
  has_many :organizations, through: :members
end

class Organization < ActiveRecord::Base
  has_many :members, dependent: :destroy
  has_many :users, through: :members
end

class Member < ActiveRecord::Base
   belongs_to :user
   belongs_to :organization
end

As you do not want to delete all users for example from an organization, just there reference to the organization and vice verse if you delete user, you do not want to delete all organizations on which user was connected to, just the reference

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM