我正在使用Rails API进行一个小型Vue项目,并且在寻找标准化我的数据的最佳方法时遇到了问题。我在后端使用Jbuilder,并希望将通过的数据展平/标准化,以便在前端更容易访问,我担心我只是不太“了解”如何使Normalizr正常工作。 / p>
目前,对于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
}
好处是,由于我可以控制前端和后端,因此可以根据需要进行修改。有没有人有什么建议?我将非常感谢您的帮助!
答案 0 :(得分:0)
感谢您提出这个有趣的问题。如果是我,我将使用后端ActiveRecord查询和JBuilder的功能完全按照我要使用的方式从API中生成JSON。无需使用normalizr
作为辅助过滤器。
与我有关的一件事是要使normalizr工作必不可少的架构重复。您在Rails中具有架构,然后在JS中具有另一个架构。改变一个需要改变另一个。保持对齐会带来集成问题。
因此,这不是一个答案,而是一个问题和建议。使用Arel和JBuilder无法完成的normalizr做什么?有了Rails模式和目标JSON的示例,有人可能会给您ARel / JBuilder来生成JSON。