2014-10-19 60 views
4

虽然与a previous question不同,但我在这里问,它是相关的,所以想链接它。如何获取水线记录的型号名称或型号类别?

我一直在努力寻找如何获得一个记录的型号名称(标识)或型号“类”(在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公开模型的伪类对象或记录的模型名称。

UPDATE: 为了澄清,我希望有一个功能,我会给任何记录,这将返回该记录的模型,无论是型号名称或型号伪类对象作为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

你存储在您的用户模型别的东西吗?你为什么认为这不是“用户”记录? – monkeyinsight 2014-10-19 01:06:36

+0

这是一个例子,我只想要一个接受参数记录的函数,并且返回这个记录的模型 – Huafu 2014-10-19 01:12:10

回答

7

WOW,研究小时后确定,这里就是我如何我这样做是为了那些有兴趣谁(这是一个非常棘手的黑客,但目前无法找到另一个这样做的方式):

比方说record是您从findOnecreate得到什么,...在回调,找出它是什么情况,所以找到模型的名称拥有的记录,你必须循环一次LL你的模型(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得到它。

+0

我不知道谁给我的答案评价了'-1',但是到目前为止它是唯一一个实际应答的函数所有细节的问题,即使不hacky(不说其他的答案当然是无用的) – Huafu 2014-10-19 20:40:00

+0

一般来说,检查对象类型不是一个好的编程习惯,如果你需要类型检查,你可能会过分复杂你的逻辑。是的,在某些情况下需要进行类型检查,但如果您经常这样做,可能您想要改变您的做事方式。 – cybercow 2015-09-30 12:42:03

+0

当然,但如果您想根据模型的某些静态属性或方法进行一些通用处理,哪条水线将无法通过实例访问? – Huafu 2015-11-25 06:36:41

1

在你的模型定义中,为什么不只是创建一个模型属性。然后模型将随每个记录呼叫一起返回。即使记录成为JSON对象,这也可以工作。

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

不,这意味着我必须为我的数据库中的所有表/集合添加一个属性/列,这将是疯狂的。 另外我不想去一个解决方案,我不得不在每个模型上添加一个属性/属性/助手,我想要一个通用的解决方案,在那里可以将他的模型定义放在那里,并且我的助手会工作。 – Huafu 2014-10-19 19:26:42

+0

太好了。这是对您的模型的一种改变,确实有一些优势。我明白,这不是你的解决方案,但它仍然是一个解决方案,并没有真正应得的一个downvote。其实Chetan的解决方案可能是最好的。 – Meeker 2014-10-19 20:31:53

+0

你在所有的数据库表中添加一列,只是为了了解表名......好吗? – Huafu 2014-10-19 20:41:52

0

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

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

这会给你原始名称。要使用它,您必须将model插入到风帆模型阵列中。

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

查看源代码以查看它的行动。(https://github.com/balderdashy/sails/blob/master/lib/hooks/blueprints/actionUtil.js#L259

+0

是的,但我不想使用请求对象,例如,如果我来自'user'路由,并且想知道'post'记录的'model'例如?或者如果我只是使用waterline lib运行一些服务器工作,而不进入sails中? – Huafu 2014-10-19 19:47:31

+0

在你自己的答案中,你引用了风帆。您的答案如何解决仅使用吃水线的服务器?为什么你不想使用请求对象?在你的问题中,“post”和“user”是关联的吗? – 2014-10-19 20:30:53

+0

嗯,我没有标记我的答案是有效的,因为我想要一个不太冒险的方式。在我的回答中,我使用'sails'只是因为定义模型的列表在'sails.models'。如果仅使用水线,则由您决定将定义的模型保存在某处而不是'sails.models'。 我不想使用请求对象,因为我希望能够根据ANY请求或我在sails之外说的来确定ANY记录的模型。与'post'和'user'的关系并不重要,它们只是作为例子给出;-)无论如何谢谢@Chetan Shenoy。 – Huafu 2014-10-19 20:39:37

0

用这个例子来解析型号名称

var parseModel = function(request) { 
    request = request.toLowerCase(); 
    return sails.models[request]; 
}; 

和控制器使用此代码对使用该模型

parseModel(req.param('modelname')).find().then().catch(); 
+0

谢谢,但正如我在Chetan Shenoy的回答中所评论的,如果您想知道与请求不相关的记录的模型,则此功能无效。 – Huafu 2015-11-25 06:33:18