2017-02-03 2 views
1

Я использую драгоценный камень active_model_serializers.Активные модели Сериализаторы has_many association

сериализаторы:

class ProjectGroupSerializer < ActiveModel::Serializer 
    attributes :id, :name, :description 
    has_many :projects 
end 

class ProjectSerializer < ActiveModel::Serializer 
    attributes :id, :name, :description 
    belongs_to :project_group 
end 

Контроллер:

def index 
    @project_groups = ProjectGroup.all.includes(:projects) 
    render json: @project_groups, include: 'projects' 
end 

Я получаю следующий ответ :

{ 
    "data": [ 
    { 
     "id": "35", 
     "type": "project_groups", 
     "attributes": { 
     "name": "sdsdf", 
     "description": null 
     }, 
     "relationships": { 
     "projects": { 
      "data": [ 
      { 
       "id": "1", 
       "type": "projects" 
      }, 
      { 
       "id": "2", 
       "type": "projects" 
      } 
      ] 
     } 
     } 
    } 
    ], 
    "included": [ 
    { 
     "id": "1", 
     "type": "projects", 
     "attributes": { 
     "name": "qweqwe", 
     "description": null, 
     "project_group_id": 1 
     }, 
     "relationships": { 
     "project_group": { 
      "data": { 
      "id": "1", 
      "type": "project_groups" 
      } 
     } 
     } 
    }, 
    { 
     "id": "2", 
     "type": "projects", 
     "attributes": { 
     "name": "ewe", 
     "description": null, 
     "project_group_id": 2 
     }, 
     "relationships": { 
     "project_group": { 
      "data": { 
      "id": "2", 
      "type": "project_groups" 
      } 
     } 
     } 
    } 
    ] 
} 

Я хочу, чтобы получить ассоциации внутри отношенийобъект, не внеincludedarray), как в ответ, что я получаю. Является ли это возможным?

PS1: BELONGS_TO ассоциация работает отлично, ассоциация приходит внутри отношенийобъекта, как и в документации.

PS2: Я хочу сделать это, потому что у меня есть 3 или 4 ассоциации, и я хочу получить к ним доступ от каждого объекта. Таким образом, я получаю ответ, будет настоящим беспорядком.

+0

Подобно тому, как в сторону: это было бы недействительным JSON: API, так что, вероятно, будет что-то легко поддерживать/поддержки нет. Предполагается, что ключ отношений содержит [объекты идентификатора ресурса] (http://jsonapi.org/format/#document-resource-identifier-objects). Клиент JSON: API должен анализировать их для вас, если вы сохраните их как действительные JSON: API (но я согласен, что это немного громоздко разобрать, если вы пишете собственный клиент). – mltsy

ответ

6

Вы можете сделать это, определив проекты вручную так.

class ProjectGroupSerializer < ActiveModel::Serializer 
    attributes :id, :name, :description, :projects 

    def projects 
    object.projects.map do |project| 
     ::ProjectSerializer.new(project).attributes 
    end 
    end 

конец

+1

Спасибо @NarashimaReddy, я также заметил, что если изменить конфигурацию в формате ': json', он также работает. –

+0

Работал отлично для меня. Разве не лучше иметь вещи под объектом 'relations', как это видно из [JSONAPI] (http://jsonapi.org/) spec? – mycellius

+0

Я согласен с @mycellius, записи из ассоциации должны быть представлены в разделе 'relations'. Кто-нибудь это сделал? Я пытаюсь заставить его работать с _Grape_ + _AMS_. – Andrey

Смежные вопросы