[英]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.