Обработка команд с разрешениями в Rails - PullRequest
0 голосов
/ 23 февраля 2019

Интересно, что лучше всего обрабатывать команды с разными наборами активных записей по всей базе данных.

Допустим, у нас есть приложение, которое используется разными командами.Каждая команда может получить доступ ко всем принадлежащим им активным записям, но не к активным записям, принадлежащим другой команде.

Примитивный способ будет

  1. добавить идентификатор команды к каждой записи
  2. при каждом создании добавлять team_id текущего пользователя к активной записи
  3. к каждому запросу добавлять, где (team_id = current_user.team_id)
  4. использовать pundit или эквивалентный гем для разрешений

Интересно, есть ли лучший способ?Например, в модели добавьте team_id с after_initialization.Можно ли автоматически добавлять team_id = current_user.team_id к каждому запросу?Что было бы лучшим способом справиться с этим?Есть ли драгоценный камень?

1 Ответ

0 голосов
/ 23 февраля 2019

«Каждая команда может получить доступ ко всем принадлежащим им активным записям», - по вашему мнению, это ваш ответ.Вся запись должна принадлежать команде.Pundit предназначен для создания политик в отношении действий (с ролями или без), вам нужен идентификатор группы, чтобы знать, откуда поступают записи, чтобы 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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...