我的模特基本上是
我已经为许多node-orm函数添加了'Q'承诺,以便以这种方式进行编程。所以现在找到qFind等...
我正在努力找到将其保存到DB(MySql)的最佳方法:
User.qGet(1004).then(function(user) {
var newIdea = new Idea({
'openedOn': new Date()
})
newIdea.setUser(user, console.log)
Idea.qCreate(newIdea).then(function(idea) {
_.each(positions, function(position) {
Security.qFind({ticker: position.ticker}).then(function(securities){
var security = securities[0]
Direction.qFind({direction: position.direction}).then(function(directions){
var direction = directions[0]
var newPosition = Position({
'weight': 1
})
newPosition.setIdea(idea, console.log)
newPosition.setDirection(direction, console.log)
newPosition.setSecurity(security, console.log)
console.log(JSON.stringify(newPosition))
}) // Direction.qFind
}) // Security.qFind
}) // _.each
console.log(JSON.stringify(idea))
res.send(idea)
}) // Idea.qCreate
}) // User.find
以下是我的问题
[错误:ER_BAD_NULL_ERROR:列'directionId'不能为空]
问题是我需要在这个对象中设置三个外键... 2.这是保存嵌套对象的正确方法吗?
答案 0 :(得分:0)
一种解决方案是设置id
var newPosition = Position({
'weight': 1
,'ideaId': idea.id
,'directionId': direction.id
,'securityId': security.id
})
Position.create(newPosition, function(e, i){
})
问题是/Associations/One.js在设置关联时调用save。
答案 1 :(得分:0)
我决定接受使用promises和Q库
第1步将q nbind添加到我的orm模型中的有趣方法中。例如:
model = db.models.direction
model['qFind'] = Q.nbind(model['find'], model);
第2步将我的模型的实例方法添加到:
setDirectionByName: function(direction) {
var _this = this;
var internalSuccess = function(directions) {
_this.direction = directions[0]
_this.directionId = directions[0].id
return directions
}
return {
then: function(externalSuccess, externalFail) {
var success = _.compose(externalSuccess, internalSuccess)
Direction.qFind({direction: direction}).then(success, externalFail)
}
}
}
在这个步骤中,我定义了一个存储属性的内部成功方法,并返回一个使用组合形成一个整体成功函数的promise(从我的模型中传递给'then'调用的函数。
第3步:处理请求并保存数据
User.qGet(1004).then(function(user) {
var newIdea = new Idea({
'openedOn': new Date()
})
newIdea.setUser(user, function(){})
Idea.qCreate(newIdea).then(function(idea) {
var positionPromises = _.map(positions, function(position) {
var newPosition = Position({
'weight': 1
,'ideaId': idea.id
})
这里我设置了外键,等待它们完成,然后异步启动Position.create,并返回一个承诺。
return Q.all([
newPosition.setDirectionByName(position.direction)
, newPosition.setSecurityByTicker(position.ticker)
]).then(function(noop) {
//newPosition.setIdea(idea)
return Position.qCreate(newPosition)
})
}) // _.map
然后使用Position对象的一系列承诺。在这里,我将等待所有人填写,然后将结果返回给客户
Q.all(positionPromises).then(function(positions){
console.log('RESULTS of POSITION Promises')
//console.log(JSON.stringify(positions))
//This doesn't seem to work as expected
//idea.setPositions(positions, function(e, o){ })
// kludge it
idea.positions = positions
console.log(JSON.stringify(idea))
console.log('/RESULTS of POSITION Promises')
res.send(idea)
})
console.log('FALL THROUGH')
}) // Idea.qCreate
}) // User.find