【问题标题】:Scoped roles using mongoid使用 mongoid 的作用域角色
【发布时间】:2011-01-19 05:05:20
【问题描述】:

使用 Mongoid,如果我有一个 Account 模型并希望将具有特定角色的用户分配给该帐户,最好将关系嵌入到 Account、User 中,还是创建一个角色集合映射帐户到具有角色名称的用户?

我希望能够返回一个帐户的所有用户,并通过 Cancan 之类的工具验证当前用户是否可以访问该帐户。

构建帐户基于用户角色的关系的推荐方法是什么?一个用户可能属于多个帐户,可能具有不同的角色,类似于 Basecamp 的工作方式。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 mongodb mongoid cancan


    【解决方案1】:

    我最近完全实现了这一点。虽然有点复杂。

    我所做的是将角色嵌入到用户中

    class User
      include Mongoid::Document
      embeds_many :roles
    end
    
    class Role
      include Mongoid::Document
    
      field :kind, :type => Symbol
      field :account_id, :type => BSON::ObjectId
      embedded_in :users, :inverse_of => :roles
    end
    
    class Account
      include Mongoid::Document
    end
    
    #adding a role to user
    account = Account.create
    user = User.create
    user.roles.create(:kind => :admin, :account_id => account.id)
    
    #all users of an account
    User.where("roles.account_id" => account.id)
    
    #users accounts
    Account.where(:_id => user.roles.map(&:account_id))
    
    #in cancan ability
    can :access, Account, :_id => user.roles.map(&:account_id)
    

    我也有 cancan 查询 access_by 工作,但它需要一些 mods 到 mongoid 才能让它工作。

    希望有所帮助 (注意:我只是在这里写了这段代码,所以不确定它是否运行)

    【讨论】: