Mar*_*lie 8 javascript sql performance ruby-on-rails ember.js
我有一个EmberJS应用程序,它由Rails 4 REST API提供支持.应用程序的工作方式很好,但是根据正在执行的查询类型,它变得非常迟缓.
目前API输出如下:
"projects": [{
"id": 1,
"builds": [1, 2, 3, 4]
}]
Run Code Online (Sandbox Code Playgroud)
当用户有许多项目在它们之间分配大量构建时,就会出现问题.EmberJS目前正在查看builds
密钥然后发出请求,/builds?ids[]=1&ids[]=2
这是我想要的行为.
这个问题可能有两种解决方案之一.
我已经尝试了各种有关预先加载的解决方案,并使用序列化程序上的自定义方法手动获取ID.这两个解决方案都添加了许多我不想做的额外代码,并且每个项目仍然会进行单独的查询.
默认情况下,rails SELECT *
在执行has_many时也会执行样式查询,而我无法弄清楚如何在序列化程序层覆盖它.我还写了一个可怕的解决方案,它将整个事情解决了一个快速查询,但它涉及编写原始SQL,我知道这不是Rails的做事方式,我宁愿没有像默认范围这样庞大的复杂不可测试查询.
而不是请求/builds?ids[]=1&ids[]=2
我宁愿不在项目中包含构建密钥,并/builds?project_id=1
在我在Ember中访问该变量时发出请求.我想我可以通过使用类似的东西在每个字段的基础上手动执行此操作:
builds: function () {
return this.store.find('builds', { project_id: this.get('id') });
}.property()
Run Code Online (Sandbox Code Playgroud)
而不是当前:
builds: DS.hasMany('build', { async: true })
Run Code Online (Sandbox Code Playgroud)
值得一提的是,这不仅适用于"构建".项目对象上有4个其他键可以执行相同的操作,因此每个项目有4个查询.
您是否确定已将索引正确添加到数据库中?在构建表上添加索引project_id
将使其工作速度更快。
或者,您应该使用链接属性来加载您的记录。
{"projects": [{
"id": 1,
"links": {
"builds": "/projects/1/builds"
}
}]}
Run Code Online (Sandbox Code Playgroud)
这意味着只有在访问关系时才会查询构建表。