Solution de contournement des voiles pour une population profonde

J’essaye de peupler une collection en profondeur.

Par exemple

// UnitType.js name: { type: 'ssortingng' } // Unit.js unitType: { model: 'unitType', via: '_id', required: true, index: true } // Product.js unit: { model: 'unit', via: '_id', required: true, index: true }, 

Le problème est que – pour autant que je sache, des recherches sur Internet peuplent en profondeur comme

 Product.find().populate('unit.unitType'); 

n’est actuellement pas supporté dans les voiles. Pour atteindre le résultat que je veux, je suis actuellement

  • requête Produits avec unit peuplement
  • interroger UnitTypes avec l’id de `product.unit.unitType“
  • .map() avec la réponse

Ceci est bien sûr loin d’être idéal. J’ai également essayé d’utiliser toJSON dans le modèle pour “pré-renseigner” l’ unitType -> ne fonctionne pas, car cela ne prend pas en charge les promesses.

Il y a pas mal de discussions sur so et de PR sur github sur cette question, mais jusqu’à présent, je n’ai pas trouvé de solution à ce problème. Y a-t-il un moyen d’améliorer cela?

    Vous pouvez essayer de remplacer Waterline ORM par Offshore ORM . Il existe un crochet pour que les voiles puissent faire cela – voiles-hook-orm-offshore .

    Il est assez facile à implémenter dans votre projet existant, car sa fourchette de Waterline offre encore plus de fonctionnalités. Seul inconvénient que j’ai trouvé est que sails-hook-validation a cessé de fonctionner.

    Comment installer

     npm install sails-hook-orm-offshore --save 

    Configuration

    .sailsrc

     { "hooks": { "orm": false, "pubsub": false } } 

    Défauts

    config/globals.js

     adapters: true, models: true 

    Usage

    Maintenant, vous serez autorisé à remplir profondément vos requêtes. Par exemple (à partir de la documentation):

     User.find() .populate('foo.bar', { name: 'foo' }) //populate foo into user and bar into foo .exec(function(err, users) { console.log(users[0].foo.bar.name) // 'foo' }); 

    Deuxième option

    Fusionner en profondeur avec la ligne de flottaison

     npm i Atlantis-Software/waterline#deepPopulate