2015-02-19 8 views
1

У меня есть has_and_belongs_to_many связь между пользователем и клиентом. Таблица clients_users имеет индексы для Пользователя и Клиента. Мои модели:Разрешения CanCanCan для ассоциации has_and_belongs_to_many

class User < ActiveRecord::Base 
    rolify 
    has_and_belongs_to_many :clients 
end 

class Client < ActiveRecord::Base 
    resourcify 
    has_and_belongs_to_many :users 
end 

Мои контроллеры являются:

class Admin::ClientsController < ApplicationController 
    load_and_authorize_resource 
end 

class Admin::UsersController < ApplicationController 
    load_and_authorize_resource 
end 

мне нужно что-то вроде этого в моем ability.rb

user ||= User.new # guest user (not logged in) 

can :read, :all 
can :manage, Client, :clients_users => { :user_id => user.id } 

Так что я мог управлять клиент только тогда, когда в таблице clients_users это запись с user_id и идентификатором этого клиента. Как мне заставить работать?

+0

'can: manage, Client do | p | c.clients_users.user_id == user.id end', что-то вроде этого должно помочь – Sontya

+0

Должно быть '| c |' вместо '| p |', но оно все равно не будет работать (больше при принятом ответе). Спасибо, в любом случае. – yazoou

ответ

3

, когда вы используете has_and_belongs_to_many, тогда у вас нет доступа к модели объединения, просто потому, что нет модели соединения, если вы хотите получить доступ к этому, тогда вам нужно сделать has_many :through.

Но в вашем случае, если вы на самом деле не нужно, чтобы получить доступ к модели присоединиться, потому что Client имеет атрибут users и User имеет атрибут clients, так почему бы не просто использовать, что вместо того, чтобы:

Я думаю, что-то вроде это должно работать

can :manage, Client, id: user.clients.pluck(:id) 
+0

Это сработало! Благодарю. – yazoou