2016-11-22 48 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

我会用has_many :though代替modelless HABTM关系。

它具有以下几个优点:

  • 如果需要的话(如时间戳的连接表,可直接查询
  • 您可以在连接模型
  • 您可以添加元数据的连接表中设置回调,谁授予的角色等)

开始通过创建命名从users_roles表格user_roles作为前者将CA迁移使用导轨寻找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