Есть ли альтернативное решение для добавления User.where(organization_id: current_user.organization_id) в каждый метод в users_controller?

#ruby-on-rails

#ruby-on-rails

Вопрос:

Я пытаюсь это сделать, потому что приложения будут использоваться несколькими организациями. Поэтому я хочу, чтобы каждый пользователь видел только данные, соответствующие его организации, которые я могу добавить .where(organization_id: current_user.organizations_id) в каждом методе в каждом контроллере, но это будет много изменений. Есть ли лучшие решения? Спасибо 🙂

Ответ №1:

Аналогичное более общее решение использует accessible_by(current_ability) cancancan gem (или другое решение для авторизации, такое как pundit и т. Д.) Для точной настройки (под капотом он будет делать то же where(organization... самое):

ability.rb:

 can :manage, SomeModelName, organization_id: user.organization_id
can :read, SomeOtherModel, user_id: user.id
 

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

Другой способ: фактически, вы можете избавить себя от изменения всех запросов с помощью default_scope и нарушения принципов mvc, перейдя current_user к области видимости модели, но я не советую этого делать — позже с этим может стать очень сложно работать.