1

我的模型本质上是

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

我已经为许多 node-orm 函数添加了“Q”承诺,以便以这种方式编程。所以 find 现在是 qFind 等...

我正在努力寻找将其保存到数据库(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. 它不工作。当我提出这个想法时,我得到了错误:

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

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

4

2 回答 2

0

我决定接受 Promise 和 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)
        }
    }
}

在这一步中,我定义了一个存储属性的内部成功方法,并返回一个利用组合形成整体成功函数的承诺(来自我的模型内部的那个传递给“then”调用的那个。

第三步:处理请求并保存数据

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 被异步启动,并返回一个 Promise。

            return Q.all([
                    newPosition.setDirectionByName(position.direction)
                    , newPosition.setSecurityByTicker(position.ticker) 
                ]).then(function(noop) {
                    //newPosition.setIdea(idea)
                    return Position.qCreate(newPosition)
                })
        }) // _.map

SO 然后为 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
于 2014-02-15T21:27:09.380 回答
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 。

于 2014-02-15T18:35:07.293 回答