Выполнение глубоко вложенных отношений родитель-потомок с использованием FeathersJS

Мне интересно, какой лучший способ сделать глубокие вложенные родительско-дочерние отношения - это использовать Feathers Рекомендуемый метод ассоциации?

Если бы мои записи были:

[
    {"name": "Grandpa", "id": 1, "parent": null},
    {"name": "Mom", "id":2, "parent": 1},
    {"name": "Baby", "id": 3, "parent": 2}
]

Затем, если бы я хотел найти верхнего родителя дерева, я бы выполнял рекурсивное получение, пока не достигну вершины дерева:

const family = app.service('/family')
function get_ancestors(childId, parents){
    const child = family.get(childId)
    if (child.parent){
        parents.push(child.parent)
        return get_ancestors(child.parent, parents)
    } else {
        return parents
    }
}

Но это кажется мне неуклюжим и не очень расширяемым. Есть ли способ лучше? Кажется, что это может сделать быстроПрисоединяйтесь, но это не относится к «Рекомендуемым» подходам к созданию ассоциаций. Я также не вижу примеров более 3 уровней в руководстве, за исключением, может быть, порционные загрузчики, И это выглядит немного сложнее, чем нам здесь нужно. Каков «рекомендуемый» способ обхода дерева предков с использованием Feathers? И наоборот, если бы у меня был дедушка, как бы я нашел Малыша? Должны ли мои записи содержать массив «детей», который заполняется, когда ребенок добавляется к ним в качестве родителя? Или есть лучший способ перейти от вершины к основанию родительского дерева?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
448
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все сводится к тому, что Feathers — это нет ORM, поэтому обработка ассоциаций во многом зависит от базы данных и выбранной вами ORM почти так же, как и в других фреймворках, таких как Express или KoaJS. Это означает большую гибкость, но также и то, что на самом деле нет единственно правильного способа сделать это, и связанная запись часто задаваемых вопросов пытается максимально полно охватить различные варианты.

fastJoin поддерживает вложенные ассоциации, но может быть медленнее, если вы используете базу данных SQL, где ORM может обрабатывать оптимизацию запросов (Sequelize также поддерживает вложенные включения). Но это может быть быстрее, чем Mongoose $populate. Проведите несколько экспериментов, чтобы увидеть, какой из них работает лучше всего. С отношениями родитель/потомок нужно обращать внимание на круговые зависимости, поэтому вы хотите использовать что-то, что может справиться с этим.

В src/models/my_service.model.js для службы Sequelize я вижу в комментариях docs.sequelizejs.com/en/latest/docs/associations. Итак, я просто настроил ассоциацию, а затем в будущих вызовах GET Sequelize будет заполнять родительские поля данными? Проблема в том, что в приведенной выше документации не говорится о функции .associate, вместо этого она выглядит так, как будто они передают модель, в которой передаются хуки, а затем вызывают другую функцию, например .belongsTo.

Brandon Keith Biggs 31.05.2019 10:39

Они также всегда имеют оба связанных объекта модели Sequelize в одном документе. Мне просто импортировать экспортированный объект из другого файла service.model.js и использовать его? Если я использую идентификаторы из той же модели, нужно ли просто передать имя текущей модели в качестве имени модели?

Brandon Keith Biggs 31.05.2019 10:40

Функция ассоциирования вызывается при запуске приложения. Он вызывается при запуске приложения и по этой причине имеет model в качестве аргумента, чтобы мы могли избежать циклического включения. Вы можете использовать models.myModel в этом методе, чтобы определить ассоциацию.

Daff 02.06.2019 18:02

Когда я использую ptestModel1.hasMany(models['ptestModel2']) в ассоциированной функции в файле ptestModel1.model.js, я получаю сбой, который происходит в ассоциированной функции, но без текста ошибки, просто начинается трассировка в Object.keys(models).forEach. Эта ошибка возникает, если я делаю вышеуказанное в файле ptestModel1 model.js и в файле ptestModel2.model.js, если я пишу ptestModel2.belongsTo(model['ptestModel1']). Я пробовал с и без продолжения.sync({force: true}), и сбой все равно произошел. Вы знаете, что может быть причиной аварии?

Brandon Keith Biggs 04.06.2019 16:10
github.com/feathersjs-ecosystem/feathers-sequelize/issues/… ответил на мой вопрос. Я не учел, что ptestModel1 будет ptestModel_1. Кроме того, примеры в предыдущем выпуске отвечают на эти вопросы.
Brandon Keith Biggs 04.06.2019 19:30

Другие вопросы по теме