2014-02-15 116 views
1

我的模型基本上是節點ORM節省嵌套對象

  • 想法有許多位置
  • 想法有一個用戶
  • 地位的一個方向
  • 地位一個安全
  • 位置有一個Idea(Idea的反面有很多位置)

我有adde d'Q'承諾許多node-orm函數以這種方式進行編程。所以發現現在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. 據不工作。當我設置的想法,我得到的錯誤:

[Error: ER_BAD_NULL_ERROR: Column 'directionId' cannot be null]

的問題是,我需要在此對象設置三個外鍵... 2.這是正確的做法,以節省嵌套的對象嗎?

回答

0

我已經決定接受使用的承諾,和Q庫

步驟1加q nbind在我的ORM模型有趣的方法。例如:

model = db.models.direction 
model['qFind'] = Q.nbind(model['find'], model); 

步驟2是加入實例方法我的模型到:在此步驟i限定,其存儲特性的內部成功方法

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'調用。

步驟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 

SO然後用承諾的用於定位對象的陣列。在這裏,我將等待他們全部填寫,然後再將結果返回給客戶端

 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 
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調用設置關聯時保存。