Как нормализовать данные по разным схемам на основе значения родительского объекта с помощью нормализатора? - PullRequest
0 голосов
/ 17 сентября 2018

Я бы хотел нормализовать данные в этом формате:

    [
      {
        id: 3,
        status: "active",
        created: "2017-07-03T15:36:11+02:00",
        published: "2017-07-03T15:38:07+02:00",
        linkables: [
          {
            data: {
              content: "Text content of the linkable",
              id: 200
            }
            linkable_type: "content",
            module_id: 3,
            module_type: "case_study"
          },
          {
            data: {
              content: "https://foobar.wee/url_of_the_media.png",
              id: 205
            }
            linkable_type: "media",
            module_id: 3,
            module_type: "case_study"
          },
        ]
      },
      ...
    ]

примерно так:

    {
      entities: {
        contents: {
          200: {
            content: "Text content of the linkable",
            id: 200
          }
        },
        media: {
          205: {
            content: "https://foobar.wee/url_of_the_media.png",
            id: 205
          }
        },
        linkables: {
          3_case_study_content_200: {
            data: 200, // in the contents key
            linkable_type: "content",
            module_id: 3,
            module_type: "case_study"
          },
          3_case_study_media_205: {
            data: 205, // in the media key
            linkable_type: "media",
            module_id: 3,
            module_type: "case_study"
          }
        },
        caseStudies: {
          3: {
              id: 3,
              status: "active",
              created: "2017-07-03T15:36:11+02:00",
              linkables: ["3_case_study_content_200", "3_case_study_media_205"]
          }
        }
      },
      result: [3]
    }

Использование версии нормализатора 2.x облегчает это благодаряк этому PR https://github.com/paularmstrong/normalizr/pull/132, который добавляет функцию, которую можно использовать для динамического решения, какую схему использовать при нормализации по значению в родительском объекте.

Однако в версии 3.xx эта дополнительная функцияне сделал это.Согласно документам , я бы сказал, что schemaAttribute выполняет свою работу.

Наличие этого куска кода, к сожалению, не дает мне желаемого результата ...

    export const caseStudies = new schema.Entity('caseStudies');

    export const media = new schema.Entity('media',);
    export const content = new schema.Entity('contents');

    export const linkablesSchema = new schema.Entity(
      'linkables',
      {},
      {
        idAttribute: (itm) => {
          const id = itm.data.id;
          return `${itm.module_id}_${itm.module_type}_${itm.linkable_type}_${id}`;
        }
      }
    );

    export const linkableSchemaMap = {
      content,
      media
    };

    caseStudies.define({
      linkables: [linkablesSchema]
    });


    export const lschema = new schema.Array(linkableSchemaMap, (value, parent) => {
      return parent.linkable_type; // this would replace the PR mentioned above?
    });

    linkablesSchema.define({
      data: lschema
    });

Спасибо за помощь!

1 Ответ

0 голосов
/ 22 сентября 2018

Самый простой способ, который пришел в голову, - это использовать processStrategy внутри linkablesSchema параметров для применения linkable_type значения в качестве свойства:

export const caseStudies = new schema.Entity("caseStudies");
export const mediaSchema = new schema.Entity("media");
export const contentsSchema = new schema.Entity("contents");
export const linkablesSchema = new schema.Entity("linkables", {}, {
  idAttribute: itm => `${itm.module_id}_${itm.module_type}_${itm.linkable_type}_${itm.data.id}`,
  processStrategy: (value) => ({ 
    ...value,
    data: value.data.id,
    [value.linkable_type]: value.data,
  })
});

linkablesSchema.define({
  content: contentsSchema,
  media: mediaSchema
})

caseStudies.define({
  linkables: [linkablesSchema]
});

normalize(data, [caseStudies]);

А вот и песочница . Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...