Включить элемент meta в идентификаторы ресурсов в объекте - PullRequest
0 голосов
/ 20 марта 2019

Исходя из моего понимания спецификации JSON: API (в частности, https://jsonapi.org/format/#document-resource-object-linkage), я смогу включить meta членов для каждого члена отношения.

Мне удалось добавитьхэш meta данных для самого объекта relationships, но не один для каждого из отдельных отношений внутри.

class PlanSerializer < ApplicationSerializer
  attributes :id, :name

  has_many :features do
    meta value: "x"
  end
end

Я знаю, что могу использовать синтаксис блока для has_many, и думаю, что этоспособ достижения этого. Но у меня это не работает. Вызов метода meta в блоке добавляет мета-блок к объекту отношения features, и мне нужно добавить один к каждой записи в этом массиве.

Мои вопросы:

Правильно ли я понял спецификацию? Должен ли быть в состоянии добавить объект meta к каждому отношению?

Как бы я поступил с сериализаторами активной модели?

Справочная информация. Моя цель - представить множество планов от плановых функций, где каждый план может иметь некоторыедополнительная информация для его собственных отношений сданная функция (и эта информация различна для каждого плана, поэтому она не относится к объекту функции)

Если вы ответите, что я не должен делать это, то этохорошо, но, пожалуйста, представьте альтернативу, которую вы считаете предпочтительной.

// My desired output
{
  "data": [
    {
      "id": "small",
      "type": "plans",
      "attributes": {
        /* Some attributes */      
      },
      "relationships": {
        "features": {
          "data": [
            {
              "id": "num-users",
              "type": "features",
              "meta": {
                "value": 1
              }
            },
            {
              "id": "num-projects",
              "type": "features",
              "meta": {
                "value": 5
              }
            }
          ]
        }
      }
    },
    {
      "id": "large",
      "type": "plans",
      "attributes": {
        /* Some attributes */
      },
      "relationships": {
        "features": {
          "data": [
            {
              "id": "num-users",
              "type": "features",
              "meta": {
                "value": 5
              }
            },
            {
              "id": "num-projects",
              "type": "features",
              "meta": {
                "value": 50
              }
            },
            {
              "id": "unlimited-downloads",
              "type": "features"
            }
          ]
        }
      }
    }
  ],
  "included": [
    {
      "id": "num-users",
      "type": "features",
      "attributes": {
        "description": "Number of users"
      }
    },
    {
      "id": "num-projects",
      "type": "features",
      "attributes": {
        "description": "Number of projects"
      }
    },
    {
      "id": "unlimited-downloads",
      "type": "features",
      "attributes": {
        "description": "Unlimited downloads"
      }
    }
  ]
}
...