虽然与我在此处提到的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)
答案 0 :(得分:7)
哇,经过几个小时的研究后,这就是我为那些感兴趣的人做的事情(这是一个非常棘手的黑客,但现在却无法找到另一种方式):
让我们说record
是你从回调中的findOne
,create
,...得到的,找出它是什么实例,然后找到它的名字拥有该记录的模型,您必须遍历所有模型(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)