Node-orm保存嵌套对象

时间:2014-02-15 17:17:07

标签: node.js node-orm2

我的模特基本上是

  • Idea有很多位置
  • Idea有一个用户
  • 位置有一个方向
  • 职位有一个安全
  • 职位有一个想法(想法的倒数有很多位置)

我已经为许多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

以下是我的问题

  1. 不行。当我设定想法时,我得到错误:
  2.   

    [错误:ER_BAD_NULL_ERROR:列'directionId'不能为空]

    问题是我需要在这个对象中设置三个外键...  2.这是保存嵌套对象的正确方法吗?

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