Sails.js / Waterline localise une association ancrée profonde

Je comprends qu'il n'y a pas de manière intégrée dans Sails.js / Waterline de peupler des associations profondes imbriquées, alors j'essaie d'utiliser les promesses de Bluebird pour y parvenir, mais je me heurte à un problème.

Je récupère avec succès l'utilisateur, et tous les messages (remplis avec la collection d'images) associés à celui-ci (console.log me montre que tout est rempli correctement). Cependant, lorsque je remplace la propriété "poste" de l'utilisateur et que j'essaye d'attribuer les messages entièrement remplis précédemment, il ne remplit pas correctement la propriété images de Post.js. C'est comme si l'ORM empêche la collecte d'image de Post.js d'être assignée manuellement.

Qu'est-ce que je fais mal? Quelle est la meilleure façon de peupler des associations profondes ancrées un à plusieurs?

Au-dessous, j'ai collé tout le code que j'exécute ….

// Populate nested association nested: function (req, res, next){ var username = req.param("id"); User .findOneByUsername(username) .populateAll() .then(function (user){ var posts = Post.find({ "user": user.id }) .populate('images') .populate('category') .then(function (posts){ return posts; }); return [user, posts]; }) .spread(function (user, posts){ user.posts = posts; // This won't work.... It assigns all the fields properly but the images collection attribute res.json(user); }).catch(function (err){ if (err) return res.serverError(err); }); } // --- User.js Model --- // module.exports = { attributes: { ....., posts: { collection: "post", via: "user" }, ..... } } // --- Post.js Model --- // module.exports = { attributes: { ...., user: { model: "user" }, images: { collection: "postImage", via: "post" }, .... } } // --- PostImage.js Model --- // module.exports = { attributes: { ...., post: { model: "post" } }, } 

Cordialement,

Sávio Lucena

Cela pourrait être une ancienne question, mais il vaut mieux avoir une réponse, alors les utilisateurs de sails.js peuvent en bénéficier.

Votre problème ici est que lorsque les voiles renvoient un enregistrement (À l'intérieur d'un tableau), les clés de cet enregistrement qui correspondent aux associations sont en fait getters / setters , et il semble que le setter ne permet pas ce que vous voulez. Vous pouvez utiliser Object.getOwnPropertyDescriptor(user, 'posts') pour confirmer. Donc, ce que vous devez faire pour pouvoir remplacer cette propriété comme vous le souhaitez, c'est appeler .toObject sur elle (ou cloner ses propriétés via _.clone ou en boucle manuelle, mais vous en trouverez beaucoup , Alors .toObject à .toObject ), en tout cas, vous obtenez un nouvel objet avec les propriétés dont vous avez besoin, et il n'y a aucune restriction quant à la façon dont vous le modifiez maintenant.

Votre code ressemblera donc à ceci:

 User .findOneByUsername(username) .populateAll() .then(function (user){ var posts = Post.find({ "user": user.id }) .populate('images') .populate('category') .then(function (posts){ return posts; }); return [user, posts]; }) .spread(function (user, posts){ user = user.toObject() // <- HERE IS THE CHANGE! user.posts = posts; // It will work now res.json(user); }).catch(function (err){ if (err) return res.serverError(err); }); } 

Vous devez remplacer chaque identifiant de publication dans le tableau des utilisateurs. Pour plus d'informations, vérifiez cette réponse https://stackoverflow.com/a/26452990/4261327 .