2016-11-22 2 views
0

私のアプリには、ユーザー、ロール、権限があります。Railsの破壊時に結合テーブルレコードを削除する

ロールを削除すると、そのロールに関連付けられているすべてのユーザーと権限がジョインテーブルで削除されます。 私はユーザーまたは権限を削除したくありません。

class Role < ActiveRecord::Base 
    has_and_belongs_to_many :users, :join_table => 'users_roles' 
    has_and_belongs_to_many :permissions, :join_table => 'roles_permissions' 
end 

ドキュメントを見ると、あなたは:dependantを使用することができますが、それは同様に、関連するレコードを破壊することになります。しかし、私は結合レコードを破壊したいだけです。

私がやって考えていた:

after_destroy :remove_associated_users 
after_destroy :remove_associated_permissions 

def remove_associated_users 
    connection = ActiveRecord::Base.connection 
    connection.execute("DELETE FROM users_roles WHERE role_id = " + self.id.to_s) 
end 

def remove_associated_permissions 
    connection = ActiveRecord::Base.connection 
    connection.execute("DELETE FROM roles_permissions WHERE role_id = " + self.id.to_s) 
end 

答えて

2

を使用することができます私はmodelless HABTM関係の代わりにhas_many :thoughを使用します。

それが持っているいくつかの利点:タイムスタンプなど(必要に応じて

  • 結合テーブルはあなたが参加するテーブルにメタデータを追加することができます
  • 参加モデルにコールバックを
  • 設定することができます
  • 直接照会することができます、誰が希望CA元として user_rolesusers_rolesからテーブルの名前を変更し、移行を作成することで、役割など)

スタートを許可しましたレールを使用してUsers::Roleを検索してください。権限結合テーブルでも同じ操作を行います。

class Role < ApplicationRecord 
    has_many :user_roles, dependent: :destroy 
    has_many :users, through: :user_roles 
end 

class UserRole < ApplicationRecord 
    belongs_to :user 
    belongs_to :role 
end 

class User < ApplicationRecord 
    has_many :user_roles, dependent: :destroy 
    has_many :roles, through: :user_roles 
    has_many :user_permissions, dependent: :destroy 
    has_many :permissions, through: :user_permissions 
end 

class UserPermission < ApplicationRecord 
    belongs_to :user 
    belongs_to :permission 
end 

class Permission 
    has_many :user_permissions, dependent: :destroy 
    has_many :users, through: :user_permissions 
end 
1

あなたはbefore_destroyコールバック

class Role < ActiveRecord::Base 
    has_and_belongs_to_many :users, :join_table => 'users_roles' 
    has_and_belongs_to_many :permissions, :join_table => 'roles_permissions' 
    before_destroy { users.clear } 
    before_destroy { permissions.clear } 
end 
関連する問題