安排我的 类 rails mongoid
Arranging my classes rails mongoid
我有 4 种用户类型
-SuperAdmin
-Admin
-Manager
-Tenant
我目前有 2 个连接器 classes
-manager_approval
-reportapproval
租户创建并拥有报告class。
我需要确保管理员、超级管理员、经理和租户可以访问 Tenants.report
的实例
目前我有以下设置,但我不确定这是否正确
class SuperAdmin
include Mongoid::Document
has_many :admins
has_many :managers
has_many :reports
end
class Admin
belongs_to :super_admin
has_many :manager_approvals, dependent: :destroy
has_many :managers
has_many :reportapprovals
has_many :reports
end
class belongs_to :admin
has_many :tenants
has_many :reports
has_many :reportapprovals, dependent: :destroy
has_many :coupons
has_many :manager_approvals, dependent: :destroy
end
class Tenant
include Mongoid::Document
has_one :report, dependent: :destroy
has_one :tenant_record, dependent: :destroy, autosave: true
has_many :reportapprovals, dependent: :destroy, autosave: true
has_many :managers
end
class Reportapproval
include Mongoid::Document
belongs_to :tenant, inverse_of: :reportapprovals
belongs_to :manager, inverse_of: :reportapprovals
belongs_to :admins
has_many :reports, dependent: :destroy
belongs_to :manager_approvals
end
class ManagerApproval
include Mongoid::Document
belongs_to :admin, inverse_of: :managers, dependent: :destroy
belongs_to :manager
has_many :reportapprovals
has_many :reports
end
class Report
include Mongoid::Document
belongs_to :tenant, dependent: :destroy
has_and_belongs_to_many :reportapprovals
has_and_belongs_to_many :managers, through: :reportapprovals
has_many :admins, through: :managers
end
这对我来说感觉不对,希望有人对其进行审核。最终,报告由租户创建,经理可以访问报告,管理员可以访问经理可以访问的所有报告,超级管理员可以访问所有经理的所有报告。感谢您的帮助!
单一集合继承
使用继承将不同类型的用户塞进同一个集合中:
class User
include Mongoid::Document
end
class Admin < User
end
class SuperAdmin < User
end
在 SQL 世界中,这就是所谓的单一 Table 继承。 MongoDB 的无模式特性消除了 STI 的许多缺点,使其成为一个非常强大的工具。
这将使您可以查询所有用户类型:
User.where(name: 'Bob') # returns any subtype
或特定类型的用户:
Admin.where(name: 'Bob') # returns only documents with the class Admin.
这在处理授权时尤其重要,因为您可能只知道用户的 ID 而不知道类型。
让他们滚
虽然拥有一个用户 class 和一个管理员 class(等等)并设置一个具有升级权限的复杂 class 树似乎是一个合理的想法,但它很少能很好地工作与现实。并且有很多缺点:
- 当用户被提升甚至降级时,您如何处理?
- 如果用户属于多个类别怎么办?
而是考虑 tried and true pattern 具有用户和角色,这允许大量的可扩展性。例如,您可以将角色范围限定为特定资源或创建角色层次结构。
class User
include Mongoid::Document
embeds_many :roles
def has_role?(role)
self.roles.where(name: role).any?
end
def admin?
has_role? :admin
end
def admin!
self.roles.find_or_create_by!(name: :admin)
end
end
class Role
include Mongoid::Document
embedded_in :user
field :name, type: Symbol
end
请注意,由于在 class 上声明关系的方式而非每个实例,基本用户 class 将包含所有关系:
class User
include Mongoid::Document
embeds_many :roles
# ...
has_many :reports
has_many :report_approvals
# ...
end
虽然它有可能在运行时将它添加到实例中,但它看起来很老套。
我有 4 种用户类型
-SuperAdmin
-Admin
-Manager
-Tenant
我目前有 2 个连接器 classes
-manager_approval
-reportapproval
租户创建并拥有报告class。
我需要确保管理员、超级管理员、经理和租户可以访问 Tenants.report
的实例目前我有以下设置,但我不确定这是否正确
class SuperAdmin
include Mongoid::Document
has_many :admins
has_many :managers
has_many :reports
end
class Admin
belongs_to :super_admin
has_many :manager_approvals, dependent: :destroy
has_many :managers
has_many :reportapprovals
has_many :reports
end
class belongs_to :admin
has_many :tenants
has_many :reports
has_many :reportapprovals, dependent: :destroy
has_many :coupons
has_many :manager_approvals, dependent: :destroy
end
class Tenant
include Mongoid::Document
has_one :report, dependent: :destroy
has_one :tenant_record, dependent: :destroy, autosave: true
has_many :reportapprovals, dependent: :destroy, autosave: true
has_many :managers
end
class Reportapproval
include Mongoid::Document
belongs_to :tenant, inverse_of: :reportapprovals
belongs_to :manager, inverse_of: :reportapprovals
belongs_to :admins
has_many :reports, dependent: :destroy
belongs_to :manager_approvals
end
class ManagerApproval
include Mongoid::Document
belongs_to :admin, inverse_of: :managers, dependent: :destroy
belongs_to :manager
has_many :reportapprovals
has_many :reports
end
class Report
include Mongoid::Document
belongs_to :tenant, dependent: :destroy
has_and_belongs_to_many :reportapprovals
has_and_belongs_to_many :managers, through: :reportapprovals
has_many :admins, through: :managers
end
这对我来说感觉不对,希望有人对其进行审核。最终,报告由租户创建,经理可以访问报告,管理员可以访问经理可以访问的所有报告,超级管理员可以访问所有经理的所有报告。感谢您的帮助!
单一集合继承
使用继承将不同类型的用户塞进同一个集合中:
class User
include Mongoid::Document
end
class Admin < User
end
class SuperAdmin < User
end
在 SQL 世界中,这就是所谓的单一 Table 继承。 MongoDB 的无模式特性消除了 STI 的许多缺点,使其成为一个非常强大的工具。
这将使您可以查询所有用户类型:
User.where(name: 'Bob') # returns any subtype
或特定类型的用户:
Admin.where(name: 'Bob') # returns only documents with the class Admin.
这在处理授权时尤其重要,因为您可能只知道用户的 ID 而不知道类型。
让他们滚
虽然拥有一个用户 class 和一个管理员 class(等等)并设置一个具有升级权限的复杂 class 树似乎是一个合理的想法,但它很少能很好地工作与现实。并且有很多缺点:
- 当用户被提升甚至降级时,您如何处理?
- 如果用户属于多个类别怎么办?
而是考虑 tried and true pattern 具有用户和角色,这允许大量的可扩展性。例如,您可以将角色范围限定为特定资源或创建角色层次结构。
class User
include Mongoid::Document
embeds_many :roles
def has_role?(role)
self.roles.where(name: role).any?
end
def admin?
has_role? :admin
end
def admin!
self.roles.find_or_create_by!(name: :admin)
end
end
class Role
include Mongoid::Document
embedded_in :user
field :name, type: Symbol
end
请注意,由于在 class 上声明关系的方式而非每个实例,基本用户 class 将包含所有关系:
class User
include Mongoid::Document
embeds_many :roles
# ...
has_many :reports
has_many :report_approvals
# ...
end
虽然它有可能在运行时将它添加到实例中,但它看起来很老套。