Используйте ActiveModel:: Serializers для включения двух родительских массивов json - программирование

Используйте ActiveModel:: Serializers для включения двух родительских массивов json

Я пытаюсь отправить мое внешнее приложение json, которое выглядит так:

{
  facilities: [
     {id: 5, name: 'happy days ranch', location: { address: '1424 Pastoral Lane', zipcode: '25245'}, instructor_ids: [2, 4, 9]}
  ],
  instructors: [
     {id: 4, name: 'Johnny Pheonix', skill: '8', picture: 'aws_url', facility_ids: [5, 8, 12}
  ]
}

Вещи, которые я пробовал

render :json => @facilities 

Сериализатор обнаруживает это. Ура! Но это не включает инструкторов

render :json => {facilities: @facilities, instructors: @instructors}

Это дает мне массив инструкторов и массив объектов, но activeModel:: Сериализаторы не используются.

render :json => [@facilities, @instructors]

Сначала я был в восторге от этого, потому что он дал мне два массива, и он использовал ActiveModel:: Serializers. Однако именно это выглядел JSON:

{facilities: [
  {facilities: [
    #my facilities data
  ]},
  {facilities: [
    #my instructor data
  ]}
]}

Я пытаюсь сделать это даже с помощью ActiveModel:: Serializers? Если да, то как?

Большое спасибо!

4b9b3361

Ответ 1

Я решил это, создав класс под названием Search, который включает в себя аспекты ActiveModel

class Search
  include ActiveModel::Serialization
  include ActiveModel::SerializerSupport

  attr_accessor :facilities, :instructors

  def initialize(facilities, instructors)
    @facilities, @instructors = facilities, instructors
  end
end

Затем я создал контроллер Searches (ничего интересного нет) и сериализатор поиска.

class SearchSerializer < ActiveModel::Serializer
  has_many :instructors, embed: :objects
  has_many :facilities, embed: :objects
end

Это создает мой желаемый json, хотя теперь он завернут в хэш поиска:

{search: {
  #the stuff I wanted 
}}

Ответ 2

Это мое решение:

render json: {
  facilities: ActiveModel::ArraySerializer.new(@facilities, each_serializer: FacilitySerializer, root: false),
  instructors: ActiveModel::ArraySerializer.new(@instructors, each_serializer: InstructorSerializer, root: false)
}

Это немного грязно. Он в основном создает экземпляр, который будет создан, за исключением выполнения вручную и дважды. Оба набора результатов отображаются с использованием ActiveModel:: Сериализаторы в правильном формате.