在Rails中处理具有权限的团队

时间:2019-02-23 10:40:49

标签: ruby-on-rails activerecord

我想知道最好的做法是通过整个数据库处理具有不同活动记录集的团队。

可以说我们有一个供不同团队使用的应用程序。每个团队都可以访问属于他们的所有活动记录,但不能访问属于另一个团队的活动记录。

原始方式是

  1. 为每条记录添加一个team_id
  2. 在每次创建中,将当前用户的team_id添加到活动记录中
  3. 向每个查询添加where(team_id = current_user.team_id)
  4. 使用专家级或相等的宝石作为权限

我想知道是否有更好的方法。例如,在模型中,添加带有after_initialization的team_id。 是否可以为每个查询自动添加team_id = current_user.team_id?处理该问题的最佳方法是什么?有宝石吗?

1 个答案:

答案 0 :(得分:0)

“我认为,“每个团队都可以访问属于他们的所有活动记录”。所有记录应属于一个团队。 Pundit旨在构建有关操作(具有或不具有角色)的策略,您需要团队ID才能知道记录的来源,因此Pundit并不是您的最佳选择。这就是我要做的

class Team < ApplicationRecord
  has_many :users
  has_many :notes
end

class Note < ApplicationRecord
  belongs_to :team
end

class User < ApplicationRecord
  belongs_to :team
end

登录后,您将拥有current_user,因此您也将拥有团队

class ApplicationController < ActionController::Base
  def current_user
    return unless session[:user_id]
    @current_user ||= User.find(session[:user_id])
  end

  def current_team
    return unless current_user
    @current_team ||= current_user.team
  end  
end

然后您可以链接关联(或使用委托)来获取记录

class NotesController < ApplicationController
  def index
    @notes = current_user.team.notes
  end
end

class NotesController < ApplicationController
  def index
    @notes = current_team.notes
  end
end

希望对您有帮助。