与SailsJS的多态关联

时间:2015-06-13 15:34:30

标签: node.js sails.js

我使用sailsJS构建一个REST API,利用蓝图。

我的设计有很多资源,其中一个是资产资源:

Asset ( id, type, owner_type, owner_id, url);

这将作为托管系统中任何其他资源的多个资产的入口点。

即。

用户资源可以包含多个图像和一个视频。所有这些记录都存储在资产资源下。

Asset ( id, type, owner_type, owner_id, url);
Asset ( 1, 'image', 'User', 1, 'http://path.to.image.com/abc.jpg');
Asset ( 2, 'video', 'User', 1, 'https://youtube.com/sdasd');
Asset ( 3, 'image', 'BlogPost', 20, 'http://path.to.image.com/blogpost.jpg');

理想情况下,当我通过ID或Get All用户获取用户时,我更愿意获取该对象的相关资产。

如果我将两个方法实现到GetOne和GetAll,它可以准备响应,但是当消耗蓝图时它有点模糊。

2 个答案:

答案 0 :(得分:2)

如果我理解你是正确的,你有用户模型,那么你有一个资产模型。

用户模型类似于

//User.js
module.exports={
    assets:{collection:'Asset',via:'owner_id'}
}

资产模型应该是

module.exports={
    type:'string',
    owner_type:'string',
    owner_id:{model:'User'},
    url:'string'
}

您将无法直接使用蓝图,但您可以执行以下操作:

//UserController.js
module.exports={
    findOne:function(req,res){
        User.findOne(req.param.id).populate('assets',{owner_type:'User'}).exec(function(data){res.json(data)});
    },
    find:function(req,res){
       User.find().populate.....//same idea
   }

}

此填充参数{owner_type}是填充选项,因此它只填充资产集合,其owner_type为“User”,您也可以指定限制,如文档here,不幸的是我没有没有找到官方文件,帆和水线仍然是一个年轻的框架,许多不清楚的文件和东西,但我认为你已经做出了正确的选择使用它。如果有帮助,请告诉我。

编辑:这只是与用户合作,如果你有博客模型也需要填充它,那么你可以手动完成

//Blog.js
var Promise=require('bluebird');
module.exports={
    findOne:function(req,res){
        Promise.all([Blog.findOne(req.param.id),
        Asset.find({owner_id:req.param.id,owner_type:'blog'})])
        .spread(function(blog,assets){
            blog.assets=assets
            return req.json(blog);
        })
    }
}

答案 1 :(得分:2)

尝试使用我的多态,深层和包容性的populat钩子:sails-hook-deep-orm解决多态关联等问题。

功能:

  • 多态种群
    • 例如:js let Results = await Status.find().populate('*');
  • 人口众多
    • 例如:js let Results = await Person.find().populate('home.occupants.statuses.*');
  • 包容性标准人群
    • 例如:js let Results = await Person.find().populate('home.occupants&state.statuses&phones.*&network');
  • 深层野生对象和数组实用程序
    • 例如:js sails.hooks.deeporm.wild.get(Records, "*.home.occupants.*.phones.0.number");