Как сгладить данные между Jbuilder и Normalizr - PullRequest
3 голосов
/ 09 июля 2019

Я работаю над небольшим проектом Vue с Rails API, и у меня возникают проблемы с поиском лучшего способа нормализации моих данных. Я использую Jbuilder на бэкэнде и хочу сгладить / нормализовать поступающие данные, чтобы облегчить доступ к ним, я боюсь, что просто не совсем понимаю, как заставить Normalizr работать правильно.

В настоящее время для jbuilder у меня есть несколько вещей, связанных с пользователем, которые я в конечном итоге хочу сохранить в Vuex.

get_current_user.json.jbuilder

json.user @user

# All of user's lists and associated categories and items
json.lists @user.lists do |list|
  json.(list, :id, :name, :active, :user_id)
  json.categories list.categories do |category|
    json.(category, :id, :name, :user_id, :created_at, :updated_at, :list_id)
    json.items category.items do |item|
      json.(item, :id, :name, :website, :price, :information, :notes, :category_id, :quantity)
    end
  end
end

# User's total hiking miles
json.total_m @user.m_by_month

# User's upcoming trips properties
json.upcoming_trips @user.upcoming_trips do |trip|
  json.(trip, :id, :name, :start_date, :end_date, :data_id, :list_id)

  # User's todo items
  json.todos trip.todo_items.sort_by {|t| t[:position]} do |todo|
    json.(todo, :id, :title, :completed, :position, :upcoming_trip_id, :user_id)
  end

  # User's shopping list items
  json.shopping_list_items trip.shopping_list_items.sort_by {|s| s[:position]} do |item|
    json.(item, :id, :title, :completed, :position, :quantity, :upcoming_trip_id, :user_id)
  end

  # User's trip details
  json.trip_details hike.trip_details.order(updated_at: :desc) do |detail|
    json.(detail, :id, :trip_type, :label, :url, :upcoming_trip_id)
  end

end

Итак, на переднем конце, перед нормализацией, пользовательский объект по существу:

- user (Object)
    - packs (Array)
        - categories (Array)
            - items (Array)
    - total_m (Array)
    - upcoming_trips (Array)
        - shopping_list_items (Array)
        - todos (Array)
        - trip_details (Array)
    - user (Object)

schema.js

import { schema } from 'normalizr';

// Define user schema
export const userSchema = new schema.Entity('user');

export const itemSchema = new schema.Entity('items', {
  user: userSchema,
});

export const listSchema = new schema.Entity('lists', {
  user: userSchema,
  items: [itemSchema],
});

// Define category schema
export const categorySchema = new schema.Entity('categories', {
  user: userSchema,
  packs: [listSchema],
});

// Define upcoming trip schema
export const upcomingTripSchema = new schema.Entity('upcomingTrips', {
  user: userSchema,
  categories: [categorySchema],
});

После звонка const normalizedUser = normalize(user, userSchema) я получу что-то вроде:

{
  - entities (Object)
      - user (Object)
          - undefined (Object)
              - lists (Array)
              - total_m (Array)
              - upcoming_trips (Array)
              - user (Object)
  - result: undefined
}

Хорошо, что, поскольку у меня есть контроль над передней и задней частью, я могу изменить его так, как захочу. У кого-нибудь есть предложения? Буду очень признателен за помощь!

1 Ответ

0 голосов
/ 17 июля 2019

Спасибо за этот интересный вопрос.Если бы это был я, я бы использовал мощные внутренние запросы ActiveRecord и JBuilder для создания JSON из API в точности так, как я хочу его использовать.Использование normalizr в качестве вторичного фильтра было бы ненужным.

Одна вещь, которая меня беспокоит, - это дублирование схемы, необходимое для работы нормализатора.У вас есть схема в Rails, а затем еще одна схема в JS.Изменение одного необходимо изменить другому.Их согласованность создает проблемы интеграции.

Таким образом, это не совсем ответ, а скорее вопрос и предложение.Что делает normalizr, чего нельзя сделать с ARel и JBuilder?Имея схему Rails и образец целевого JSON, кто-то может дать вам ARel / JBuilder для создания JSON.

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