Ruby on Rails:如何区分用户作为管理员与普通成员的群组?
Rails风格实现用户群组查询方案
首先修正你的User模型关联命名(当前两个has_many :groups会产生覆盖冲突),通过命名区分不同关联逻辑:
class User < ApplicationRecord # 用户作为管理员创建的群组 has_many :admin_groups, class_name: 'Group', foreign_key: :admin_id, dependent: :destroy # 用户作为成员加入的所有群组(含自己创建的) has_many :members, dependent: :destroy has_many :joined_groups, through: :members, source: :group end
需求实现
1. 获取用户作为管理员的群组
直接调用命名关联即可,完全符合Rails的关联查询风格:
user.admin_groups
2. 获取用户仅作为普通成员的群组
在User模型中添加实例方法,通过查询链过滤掉自己作为管理员的群组:
class User < ApplicationRecord # ... 已定义的关联 ... def member_only_groups joined_groups.where.not(id: admin_groups.select(:id)) end end
调用方式:
user.member_only_groups
关于拆分用户模型的评估
不需要将User拆分为UserAdmin和NormalUser子类(单表继承),因为你的业务场景中,一个用户可以同时拥有管理员和普通成员两种身份,而单表继承是用于划分互斥的用户类型,会限制用户身份的灵活性。当前通过命名关联+查询方法的方案,更贴合业务逻辑,也更符合Rails的设计哲学。
内容的提问来源于stack exchange,提问作者josegp
相关产品推荐
相关产品推荐

