CanCan способность по ассоциации - PullRequest
0 голосов
/ 17 мая 2018

Мой вопрос касается определения способности cancancan в следующем контексте.

У меня есть общая модель отношений между многими пользователями между сущностями пользователя и компании

class User < ApplicationRecord
    has_many :company_users, dependent: :destroy
    has_many :companies, through: :company_users 
    enum role:[:user, :admin, :superadmin]
end

class Company < ApplicationRecord
    has_many :company_users, dependent: :destroy
    has_many :users, through: :company_users
end

class CompanyUser < ApplicationRecord
    belongs_to :company
    belongs_to :user
end

Я хочу теперь определитьВозможность cancan, чтобы авторизованный текущий пользователь мог управлять всеми пользователями, принадлежащими к тем же компаниям, что и он.

У меня нет проблем с другими схемами многие ко многим (например, многие ко многим между Устройством и Компанией), как это

can :manage, Device, :companies => {:users => {:id => user.id}}

работает нормально!

но

can :manage, User, :companies => {:users => {:id => user.id}}

позвольте мне видеть, конечно, только текущего пользователя, потому что он находится в той же таблице пользователей.

Как я могу легко управлять этой способностью между пользователями, принадлежащими к одной компании, сохраняя отношения многие ко многим?

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

По рекомендации @coorasse я наконец-то решил свою проблему, используя 2 области видимости, как указано в user.rb

scope :company_list, -> (user_id) {CompanyUser.where(:user_id => user_id).pluck(:company_id)}
scope :owned_users,  -> (user_id) {CompanyUser.where(:company_id => company_list(user_id)).pluck(:user_id).uniq}

и в способе .rb

can :manage, User, id: User.owned_users(user.id)

Этоработает нормально.

0 голосов
/ 17 мая 2018

Вы можете решить проблему, используя области действия: https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities-with-Blocks#block-conditions-with-scopes

и определение:

can :manage, User, User.joins(companies: :users).where(companies: { users: { id: user.id } })

пожалуйста, посмотрите полный текст: https://gist.github.com/coorasse/f1174b618651fcee8c65525d38b36120

...