1

私のモデルは本質的に

  • アイデアには多くのポジションがあります
  • アイデアには 1 人のユーザーがいます
  • ポジションには1つの方向があります
  • ポジションには証券が 1 つあります
  • ポジションには 1 つのアイデアがあります (アイデアには多くのポジションがあります)

そのようにプログラムするために、node-orm 関数の多くに「Q」プロミスを追加しました。find は 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. 機能していません。アイデアを設定すると、エラーが発生します。

[エラー: ER_BAD_NULL_ERROR: 列 'directionId' を null にすることはできません]

問題は、このオブジェクトに 3 つの外部キーを設定する必要があることです... 2. これは、ネストされたオブジェクトを保存するための正しいアプローチですか?

4

2 に答える 2

0

1つの解決策は、IDを設定することです

var newPosition = Position({
    'weight': 1
    ,'ideaId': idea.id
    ,'directionId': direction.id
    ,'securityId': security.id
})  

Position.create(newPosition, function(e, i){

})

問題は、関連付けを設定するときに /Associations/One.js 呼び出しが保存されることです。

于 2014-02-15T18:35:07.293 に答える
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」呼び出しに渡されたモデル内のモデルからのもの)。

ステップ 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 が非同期的に開始され、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 に答える