簡體   English   中英

刪除Rails中destroy上的聯接表記錄

[英]Remove join table records on destroy in 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

我將使用has_many :though而不是無模型的HABTM關系。

它具有幾個優點:

  • 聯接表可以直接查詢
  • 您可以在聯接模型上設置回調
  • 您可以根據需要將元數據添加到聯接表中(例如時間戳記,授予角色的人等)。

首先創建一個遷移,該遷移將表從users_roles重命名為user_roles因為前者會導致Rails查找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

您可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM