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