aph*_*000 5 javascript node.js sails.js waterline
我正在努力将我的业务逻辑放在我的SailsJS项目中.
我的数据模型如下:
Portfolio (hasMany) -> Positions (hasOne) -> Asset-> (hasMany) Ticks
Run Code Online (Sandbox Code Playgroud)
我希望使用父模型上的计算属性来汇总子项的数据,一直到项目组合.eG an Asset知道最新的价格(价格),该位置知道其当前价格(numberShares*其资产的最新Tick)等.理想情况下,我想将此数据添加到JSON,以便我可以将业务逻辑从Ember客户端移开.
这适用于一个级别,但如果我尝试使用子级的计算属性,它是非定义的或使用toJSON()为空时
Asset.js:
latestTick: function () {
if (this.ticks.length> 0)
{
this.ticks.sort(function(a, b){
var dateA=new Date(a.date), dateB=new Date(b.date)
return dateB-dateA
})
return this.ticks[Object.keys(this.ticks)[0]].price;
}
return 0;
},
toJSON: function() {
var obj = this.toObject();
if (typeof this.latestTick === 'function')
obj.latestTick = this.latestTick();
return obj;
}
Run Code Online (Sandbox Code Playgroud)
这是有效的(在添加类型检查后,根据它是否被嵌套返回它不起作用).
现在在Position.js
assetID:{
model: "Asset",
},
Run Code Online (Sandbox Code Playgroud)
我想计算currentValue:
currentValue: function () {
return this.assetID.latestTick() * this.numberShares;
},
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为该功能不可用(只有硬编码属性).我尝试使用Tick.Find()...但遇到异步问题(在获取数据之前返回JSON).
我试图强制嵌入/填充JSON中的关联,但它没有任何区别.一旦我跨越多个层次结构级别,我就不会获得任何数据.
我应该在哪里进行这种聚合?我不想使用自定义控制器操作,而是利用REST API.
水线不支持深度填充。如果您想实现这样的深度查询,如果您使用的是 Sails < 1,则可以使用native( https://sailsjs.com/documentation/reference/waterline-orm/models/nativemanager ),或者( https://sailsjs .com/documentation/reference/waterline-orm/datastores/manager)如果您使用 Sails >= 1
这样,您就可以使用任何数据库能力来构建这种“更高级”的查询。