如何获取水线记录的型号名称或模型类?

时间:2014-10-19 01:04:03

标签: node.js sails.js watermark waterline

虽然与我在此处提到的a previous question不同,但它与之相关,因此希望将其链接起来。

我一直在努力寻找如何获取模型名称(标识)或模型" class" (在sails.models中公开)的记录。因此,给定waterline记录,我如何找到其型号名称或类别?

示例(当然,我知道模型是User,但这是一个例子):

User.findOne(1).exec(function(err, record) {
  // at this point think that we don't know it's a `user` record
  // we just know it's some record of any kind
  // and I want to make some helper so that:
  getTheModelSomehow(record);
  // which would return either a string 'user' or the `User` pseudo-class object
});

我尝试使用record.constructor访问它,但这不是User,我无法在record上找到任何属性,从而暴露模型的伪-class对象或记录的模型名称。

更新: 为了澄清,我想要一个函数,我将给出任何记录,并将该记录的模型作为模型名称或模型伪类对象返回,如sails.models命名空间

modelForRecord(record) // => 'user' (or whatever string being the name of the record's model)

modelForRecord(record) // => User (or whatever record's model)

3 个答案:

答案 0 :(得分:7)

哇,经过几个小时的研究后,这就是我为那些感兴趣的人做的事情(这是一个非常棘手的黑客,但现在却无法找到另一种方式):

让我们说record是你从回调中的findOnecreate,...得到的,找出它是什么实例,然后找到它的名字拥有该记录的模型,您必须遍历所有模型(sails.models.*)并以这种方式进行instanceof调用:

function modelFor(record) {
  var model;
  for (var key in sails.models) {
    model = sails.models[key];
    if ( record instanceof model._model.__bindData__[0] ) {
      break;
    }
    model = undefined;
  }
  return model;
}

请勿尝试简单地执行instanceof model,这不起作用

如果您需要型号名称,只需modelFor(record).globalId即可获得它。

答案 1 :(得分:1)

在模型定义中,为什么不创建模型属性。然后每次录音都会返回模型。即使记录成为JSON对象,这也会起作用。

module.exports = {
 attributes : {
      model : {type:'string',default:'User'}
 }
}

答案 2 :(得分:0)

Sails公开请求对象中的所有内容。尝试以这种方式获取模型的名称:

var model = req.options.model || req.options.controller;

这会给你原始名称。要使用它,您必须将model插入到sails模型数组中。

var Model = req._sails.models[model];

查看源代码以查看其实际效果。 (https://github.com/balderdashy/sails/blob/master/lib/hooks/blueprints/actionUtil.js#L259