Pundit通过连接表确定模型所有权 - Rails 4

时间:2014-10-09 16:17:11

标签: mysql ruby-on-rails ruby join pundit

我通过联接表将用户与给定公司联系起来因为我需要能够让每个公司拥有一大堆用户,反之亦然。

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

1 个答案:

答案 0 :(得分:4)

这应该对你有用

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)。