帆/水线:返回模型关系

时间:2016-08-24 21:57:03

标签: mysql node.js sails.js waterline

所以,我正在使用SailsJS创建一个小应用程序。我的数据库是MySQL。 当我测试时,首先我创建一个“市场”记录,然后创建一个链接到“市场”的“股票”记录,在另一个时刻,我检索这个股票记录。

我有以下型号:

股票模型:

module.exports = {

  attributes: {
    intern_id: {
      type: 'string'
    },
    tick: {
      type: 'string'
    },
    market: {
      model: 'market'
    }
  }
};

市场模式:

module.exports = {
  attributes: {
    tick: {
      type: 'string'
    },
    name: {
      type: 'string'
    },
    description: {
      type: 'string'
    },
    stocks: {
      collection: 'stock',
      via: 'market'
    },
  }
}

然后,首先我创建一个“市场”并使用返回的对象与我的“stock”对象关联:

创建并获得我的市场记录:

Market.create({tick: 'BVMF', name: 'Bovespa', description: 'Bolsa de Valores'}).exec(function(err, market) {
    if(err) done(err);
});

var market = Market.findOne({tick: 'BVMF'}).then(function(results){return results;});

创建我的股票记录:

Stock.create({intern_id: '1234', tick: 'VALE5', description: 'Vale SA', market: market}).exec(function(err, stock) {
   if(err) done(err);
});

然后,当我试图收回这个股票时,即使我称之为populate('market'),也不会检索市场对象:

Stock.findOne({tick: 'VALE5'}).populate('market').exec(function(err, record) {    
   console.log(record);
});

1 个答案:

答案 0 :(得分:2)

没有太多信息,但我想。

相反:

Stock.findOne({tick: 'VALE5'}).populate('market').exec(function(err, record) {    
   console.log(marketObj);
});

应该是:

Stock.findOne({tick: 'VALE5'}).populate('market').exec(function(err, record) {    
   console.log(record);
});

<击>


第二个答案:

你忘了异步。你应该这样做:

Market.create({tick: 'BVMF', name: 'Bovespa', description: 'Bolsa de Valores'}).exec(function(err, market) {
    if(err){
        done(err);
    } else {
        Stock.create({intern_id: '1234', tick: 'VALE5', description: 'Vale SA', market: market.id}).exec(function(err, stock) {
            if(err){
                done(err);
            } else {
                Stock.findOne({tick: stock.tick}).populate('market').exec(function(err, record) {    
                    console.log(record); // and there is your "Stock" with populated "market"
                });
            }
        });
    }
});