我如何添加一个实例方法到sails.js中的所有模型?

我想为所有将使用元数据的模型添加一个默认的显示函数,与属性/关联定义不同,对实例的属性/关联进行操作,使其适合显示在UI中。

例如:

Foo.findOne(someId) .exec(function(err, foo) { ... res.view({ foo: foo.toDisplay(), }); }); 

所以,我想添加这个function,所有的模型。 我可以想象一个

 Model.prototype.toDisplay = ... 

解决scheme,但我不知道从哪里获得模型(需要长时间('waterline /…./ model')path),如果我有模型,在哪里放置这个剪辑。

请指教。

SailsJS.org上的模型configuration完整logging在这里 。 @umassthrower指出添加一个实例方法到config/models.js会将它添加到所有的模型中是正确的。 他也正确地认为这不是configuration文件的预期用途。

你在Sails中比Rails更具挑战性的原因是Ruby有实际的类和inheritance,而Javascript只有对象。 一个相当干净的方法来模拟inheritance和扩展你的模型对象从“基”对象将是使用像Lodash的_.merge函数 。 例如,您可以将您的基本模型保存在lib/BaseModel.js

 // lib/BaseModel.js module.exports = { attributes: { someAttribute: 'string', someInstanceFunction: function() { // do some amazing (synchronous) calculation here } } }; 

然后在你的模型文件中,需要lodash并使用_.extend

 // api/models/MyModel.js var _ = require('lodash'); var BaseModel = require("../../lib/BaseModel.js"); module.exports = _.merge({}, BaseModel, { attributes: { someOtherAttribute: 'integer' } }; 

您的基础模型的属性将与MyModel合并, MyModel优先。

将空模型的第一个参数设置为{}很重要。 _.merge是破坏性的第一个对象发送,所以如果你只是做了_.merge(BaseModel, {...}那么基础模型将被修改。

另外,记得npm install lodash

这可以通过将你的函数添加到模型属性来完成,如下所示:

 module.exports = { attributes: { attribute1: { type: String }, attribute2: { type: String }, toDisplay: function () { // your function here } // You can also override model functions like .toJSON or .toObject toJSON: function () { // your custom JSON here } } } 

在属性方法下的模型的Sails文档中有更多的信息。 值得注意的是,根据你在做什么,你可能根本不需要toDisplay()方法。 如果您只是尝试格式化任何输出或删除任何敏感信息,则可以重写toJSON()方法。