Роли с ограниченной областью действия с использованием mongoid

Используя Mongoid, если у меня есть модель учетной записи и я хочу назначить пользователей с определенными ролями для этой учетной записи, лучше всего встроить отношения в учетную запись, пользователя или создать учетную запись сопоставления коллекции ролей с пользователем с именем роли?

Я хочу иметь возможность вернуть всех пользователей учетной записи, а также подтвердить, что текущий пользователь имеет доступ к учетной записи с чем-то вроде Cancan.

Каков рекомендуемый способ структурирования отношений на основе ролей учетной записи ‹-> пользователя? Пользователь может принадлежать нескольким учетным записям потенциально с разными ролями, подобно тому, как работает Basecamp.


person p47    schedule 19.01.2011    source источник


Ответы (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, доступный_by, но для его работы потребовались некоторые моды для монгоида.

Надеюсь, это поможет (Примечание: я только что написал этот код здесь, поэтому не уверен, что он работает)

person stellard    schedule 03.02.2011