【问题标题】:Remove join table records on destroy in Rails在 Rails 中删除连接表记录
【发布时间】:2016-11-22 17:21:49
【问题描述】:

在我的应用中,我有用户、角色和权限。

当我删除一个角色时,我想在连接表中删除与该角色关联的所有用户和权限。 我不想删除用户或权限。

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

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    我会使用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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 2011-01-23
        • 1970-01-01
        相关资源
        最近更新 更多