【发布时间】:2014-04-09 21:27:45
【问题描述】:
我有一个由 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,我宁愿在项目中根本不包含构建密钥,而是在我在 Ember 中访问该变量时向/builds?project_id=1 发出请求。我想我可以通过使用类似的东西在每个字段的基础上手动执行此操作:
builds: function () {
return this.store.find('builds', { project_id: this.get('id') });
}.property()
而不是当前的:
builds: DS.hasMany('build', { async: true })
还值得一提的是,这不仅适用于“构建”。项目对象上还有 4 个其他键执行相同的操作,因此每个项目有 4 个查询。
【问题讨论】:
-
我认为尽可能使用 ORM。但在必要时用原始 SQL 覆盖。主动记录如此方便,但也如此缓慢。您的数据库上的一些信息可能会有所帮助,是 MySQL 吗?您的数据透视表/联接表上的索引是什么样的?
-
这个问题是否得到了亚历克斯足够好的马克?你能选择答案吗?你是怎么做到的?很想知道:)
标签: javascript sql ruby-on-rails performance ember.js