Отображать только определенные ассоциации как json в Rails - PullRequest
0 голосов
/ 17 июня 2020

У меня есть следующие настройки модели в рельсах:

  • Разрешения для каждого пользователя 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 на их списки.

Насколько я видел, не существует эффективного и масштабируемого способа делать это. Я рассмотрел пару вещей:

  1. Переопределите метод 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 , Активные сериализаторы моделей , похоже, ни один из них не обеспечивает эту функциональность.

Я знаю способы сделать это, я ищу эффективный и правильный способ. Буду очень признателен за помощь в этом вопросе.

...