0

У меня возникли проблемы с поиском, как получить объект ActiveRecord с глубоко вложенными ассоциациями. Ниже приведен пример того, что я пытаюсь достичь, выраженный как объект JSON.Получение глубоко вложенных ассоциаций ActiveRecord

В настоящее время моя модель имеет проекты:

  1. has_many :groups
  2. has_many :users, through: :groups
  3. has_many :members, through: :groups, source: :users

Ожидаемый результат (JSON):

{ 
    "id": 7, 
    "name": "Test Project", 
    "description": "Project description", 
    "groups": [ 
    { 
     "id": 1, 
     "name": "Test Group 1", 
     "description": "First test group", 
     "members": [ 
     { 
      "id": 1, 
      "name": "Admin", 
      "email": "[email protected]" 
     }, 
     { 
      "id": 2, 
      "name": "Test User", 
      "email": "[email protected]" 
     } 
     ] 
    } 
    ] 
} 

Пример кода:

class Project < ActiveRecord::Base 
    has_many :groups 
    has_many :users, through: :groups 
    has_many :members, through: :groups, source: :users 
end 

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

Ближайший результат (JSON):

{ 
    "id": 7, 
    "name": "Test Project", 
    "description": "Project description", 
    "groups": [ 
    { 
     "id": 1, 
     "name": "Admin", 
     "email": "[email protected]" 
    }, 
    { 
     "id": 2, 
     "name": "Test User", 
     "email": "[email protected]" 
    } 
    ] 
} 

Пример кода:

class Project < ActiveRecord::Base 
    has_many :groups 
    has_many :users, through: :groups 
    has_many :members, through: :groups, source: :users 

    def groups 
    members.all 
    end 
end 

ответ

1

Вы можете попробовать использовать ActiveModel serializ чтобы включить связанные записи.

class ProjectSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :groups 
end 

class GroupSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :members 
end 

Вы можете проверить это более по адресу: https://github.com/rails-api/active_model_serializers

has_many, has_one и belongs_to декларации описывают отношения между ресурсами. По умолчанию, когда вы сериализуете сообщение, вы также получите его комментарии.

+1

Это идеальный вариант! Благодарю. Мы используем сериализаторы, но я не думаю, что полностью их понял. Я имею в виду, я все еще не знаю, но вы определенно помогли мне понять их в этом сценарии. Благодаря! – OBCENEIKON

+0

Вас приветствуют. Я думаю, что вы могли бы начать с чтения сериализации: https://en.wikipedia.org/wiki/Serialization > В информатике, в контексте хранения данных, сериализация представляет собой процесс перевода структур данных или состояния объекта в формат, который может быть сохранен (например, в буфере файла или памяти или передан по линии сетевого соединения) и впоследствии реконструирован в той же или другой компьютерной среде. – adantj

0

Вы можете сделать:

class Project < ActiveRecord::Base 
    has_many :groups 
    has_many :users, through: :groups 
    has_many :members, through: :groups, source: :users 
end 

Project.find(7).to_json(include: {groups: {include: :users}})