У меня есть следующие настройки модели в рельсах:
- Разрешения для каждого пользователя
has_many
и has_many :rosters, through: :permissions
- Каждое разрешение
belongs_to
пользователь и список . - Каждый реестр
has_many :users, through: :permissions
Короче говоря, пользователь и реестр по существу связаны с моей таблицей соединения разрешений, в которой есть несколько столбцов для определения того, что может его пользователь делать со своим составом. Идея здесь в том, что у списка есть один пользователь-владелец и много администраторов, сопровождающих и т. Д. c.
Мне нужно иметь возможность отображать все списки пользователей и связанные с ними разрешения для этого конкретного пользователя. с одного из моих контроллеров как JSON (поскольку я использую рельсы для приложения API).
Проблема в том, что если я использую простой render json: current_user.rosters.as_json(include: :permissions)
, я (как и ожидалось) закончу рендеринг всех разрешения для всех списков current_user
, а не только разрешение current_user
на их списки.
Насколько я видел, не существует эффективного и масштабируемого способа делать это. Я рассмотрел пару вещей:
- Переопределите метод
as_json
для модели списка, чтобы он принял параметр параметра user
. Затем запросите разрешение пользователя в этом списке и объедините его с json ha sh:
# app/models/roster.rb
# This would be inside the Roster class.
def as_json(**options)
hash = super(**options)
if (user = options[:user])
hash.merge!('permissions' => permissions.find_by(user_id: user.id).as_json)
end
hash
end
Проблема с этим подходом : Я бы запустил запрос в базе данных для каждого состава в реестрах пользователя, что неэффективно.
Отображение разрешений пользователя вместо отображения списков и включение связанных списков. Это означало бы размещение чего-то вроде этого в моем
RostersController
:
# app/controllers/rosters_controller.rb
def index
render json: current_user.permissions.as_json(include: :roster)
end
Проблема с этим подходом : Первая небольшая проблема заключается в том, что это помещает мой список под ключ 'roster'
в json ha sh, поэтому я получаю что-то вроде: { permission_attribute_1: 'value', ..., roster: { roster_attribute_1: 'value' } }
, что не является нарушением сделки, поскольку вместо этого я мог бы переопределить метод as_json
в модели разрешений.
в этом случае у самих реестров есть дочерние модели, которые должны будут делать что-то подобное в своих контроллерах. Также действительно кажется неправильным тайно отображать разрешения в контроллере реестров вместо реестров.
Кроме того, я просмотрел другие JSON библиотеки сериализатора, такие как fast json_api , jsonapi.rb , Активные сериализаторы моделей , похоже, ни один из них не обеспечивает эту функциональность.
Я знаю способы сделать это, я ищу эффективный и правильный способ. Буду очень признателен за помощь в этом вопросе.