首页 > 解决方案 > Rails依赖破坏不起作用

问题描述

我有UserOrganization模型。User has_many :organizationsOrganization has_many :users

当我想使用从数据库中销毁用户时@user.destroy出现错误Key (id)=(3) is still referenced from table "organizations".

这是我的用户和组织模型:

组织.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

用户.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

会员.rb

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

标签: ruby-on-railspostgresql

解决方案


你不应该有dependent_destroyfor :organizationsor :users,只是 for :members

您没有组织与用户之间的直接关系,也没有用户与组织之间的直接关系。

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

由于您不想删除所有用户,例如从组织中删除,只需引用该组织,反之亦然,如果您删除用户,您不想删除用户连接到的所有组织,只需引用


推荐阅读