2014-10-09 5 views
1

Я связываю пользователей с данными фирмами через таблицу соединений, потому что мне нужно иметь кучу пользователей с каждой фирмой и наоборот.Pundit Scoping для владения моделью через таблицу Join - Rails 4

class User 
    has_many :firm_connections, dependent: :destroy 
    has_many :firms, through: :firm_connections 
end 

class FirmConnection 
    belongs_to :user 
    belongs_to :firm 
end 

class Firm 
    has_many :firm_connections 
    has_many :users, through: :firm_connections 
end 

Мой вопрос, когда пользователь попадает на страницу индекса для фирм, как я это сфера только показать, что эти пользователи связаны с?

class FirmPolicy < ApplicationPolicy 
    class Scope < Scope 
    def resolve 
     if user.admin? 
     scope.all 
     else 
     scope.where #only the firms associated with that user 
     end 
    end 
    end 

Нужно ли создавать область на уровне фирмы, которая принимает @user? Или я могу сделать это все напрямую? Я мог взломать что-то вместе, но еще не обмотал голову вокруг пандита, поэтому любое направление было бы очень благодарным!

так:

def self.associated_with(user) 
    all.select { |m| m.users.include?(user) } 
end 

ответ

3

Это должно работать для вас

class Firm 
    def index 
    @firms = policy_scope(Firm) 
    end 
end 

class FirmPolicy < ApplicationPolicy 
    class Scope < Scope 
    def resolve 
     if user.admin? 
     scope.all 
     else 
     user.firms #only the firms associated with that user 
     end 
    end 
    end 
end 

политика не всегда должны называть его так, что вы думаете, он просто должен вернуть что-то (для областей, почти всегда ActiveRecord :: Relation, для регулярных, истинных или ложных). Вы можете сделать

scope.includes(:firm_connections).where(firm_connections: { user_id: user.id }) 

но это не так читаемо (ИМО).

Смежные вопросы