2014-10-09 63 views
1

我通過聯接表將用戶與給定公司關聯,因爲我需要能夠爲每個公司提供一羣用戶,反之亦然。專家通過聯合表來確定模型所有權範圍 - 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 }) 

但這不是可讀性(IMO)。