sailsjs - 创建一个POST多个记录和关联

时间:2016-07-07 09:07:37

标签: node.js sails.js associations waterline sails-postgresql

发票 - 型号:

attributes: {
  number: {
    type: 'integer'
  }
  lines: {
    collection: 'line',
    via: 'invoice'
  }
}

订单 - 型号:

attributes: {
  name: {
    type: 'integer'
  }
  invoice: {
    model: 'invoice'
  }
}

正如您所看到的,这些模型具有一对多的关系。一切都很好。

但现在我想使用与之关联的Blueprint API创建新的发票和新的

文档说您可以使用此架构创建新记录并将其添加到现有记录中:POST /:model/:id/:association/:fk

但它没有说明是否可以同时创建两个记录并将它们关联起来。

更多详细信息:我已收到发票,您可以在此发票中添加包含产品,数量和其他内容的行。现在,当用户点击“保存”时,我需要创建一个新发票和新行并以某种方式关联它们。

我应该为此创建一个自定义控制器动作,还是我过度思考这个并且我应该完全不同的做这件事?

1 个答案:

答案 0 :(得分:0)

使用以下代码可以在SailsJS中创建带有新行的新发票:

Invoice.create({number: 1, lines: [
  {
    name: '1'
  }
]})

这将创建一个编号为1的新发票,并创建一个名称为1的新行。第1行将与发票相关联。 由于lines是一个集合,您可以将它们添加为数组,因此可以在Invoice中添加多个Line。 您可以在InvoiceController中覆盖您的create函数并添加此代码。

另一种解决方案是使用Promises。确保使用以下命令安装bluebird:

npm install bluebird

将以下代码放在控制器的顶部

var Promise = require('bluebird');

您可以使用以下代码:

createWithPromises: function(req, res){
var lineName = 1;
var invoiceNumber = 2;

Invoice.create({number: invoiceNumber})
  .then(function(result){
    Line.create({name: lineName, invoice: result})
  })
  .then(function(result){
    sails.log(result);
  })

}

首先,它会创建一个编号为2的发票。如果成功,它将创建一个Line,并且作为发票的参数,您可以提供先前创建调用的结果。 有关Promises的信息,请检查http://bluebirdjs.com/docs/getting-started.html