ActiveModelSerializer: как добавить ассоциацию к пользовательскому атрибуту? - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть сериализатор с пользовательским атрибутом, и мне нужно включить связь с этим пользовательским атрибутом, но я не могу его выяснить:

def dependent_integrations
  object.integrations.includes(:service_integrations).where(service_integrations: { master: false}).map do |integration|
    # this.integration.organization_integrations ===> I need to include organization_integrations into to integration object for serializer
  end
end

И получить JSON для кода:

"dependent_integrations": [
                {
                    "id": 2,
                    "name": "Confluence Cloud",
                    "key": "confluence-cloud",
                    "description": "blablaabla",
                    "vendor": "Atlassian",
                    "active": true,
                    "created_at": "2020-04-08T18:16:01.000Z",
                    "updated_at": "2020-04-08T18:16:03.000Z",
                    "custom": false
                },
            ]
        },

Но мне нужно получить следующее JSON с включенной организацией_интеграции:

"dependent_integrations": [
                {
                    "id": 2,
                    "name": "Confluence Cloud",
                    "key": "confluence-cloud",
                    "description": "blablaabla",
                    "vendor": "Atlassian",
                    "active": true,
                    "created_at": "2020-04-08T18:16:01.000Z",
                    "updated_at": "2020-04-08T18:16:03.000Z",
                    "custom": false,
                    "organization_integrations": [
                        {
                           id: 1,
                           .......
                        },
                        {
                           id: 2,
                           .......
                        }
                    ]
                },
            .........
            ]
        },

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

То, что вы хотите, это сделать ассоциацию внутри вашего сериализатора. Вам нужно работать с различными сериализаторами для каждой модели, которую вы рендерите. Обратите внимание, что вы не указали, какую версию rails вы используете, поэтому следующий код может работать некорректно

# your serializer
def dependent_integrations
  ActiveModel::Serializer::CollectionSerializer.new(integrations, each_serializer: IntegrationSerializer).as_json
end

private

def integrations
  object.integrations.includes(:service_integrations).where(service_integrations: { master: false })
end

# IntegrationSerializer
class IntegrationSerializer < ActiveModel::Serializer
  attributes :id, :name, :key, :description, :vendor, :created_at, :updated_at, :custom, :organization_integrations

  def organization_integrations
    ActiveModel::Serializer::CollectionSerializer.new(object.organization_integrations, each_serializer: OrganizationIntegrationSerializer).as_json
  end
end

# OrganizationIntegrationSerializer
class OrganizationIntegrationSerializer
  attributes :id # ...
end
0 голосов
/ 16 апреля 2020

Попробуйте использовать параметр include в методе рендеринга.

def your_action
  # ...
  render(
    :json,
    include: 'parent_model.integrations.service_integrations',
    # ...
  )
end
...