1

我们有一个 Rabl 视图,它由带有嵌套子级的 Rails 动作提供支持,结构如下:

:foo has many :bars
:bar has many :baz

这意味着我们的 rabl 视图可能看起来像这样:

collection @foo
attributes (#whatever)
child(:bar) {attributes :baz}

这非常有效,除了 Rabl 执行一个新查询来加载每个 bar 对象以及每个 baz 对象(最多有 7 个 baz 对象)。生成原始集合的查询需要不到 100 毫秒的时间返回,但总渲染时间需要 8 秒以上,并且每条foo记录包括大约 30 个额外的查询。我已经尝试使用includes语法来预加载关联的行,这样 Rabl 就不需要重新加载它们,但它似乎只是忽略了发送的信息。

我正在寻找关于如何优化此操作的想法,以便我们可以从中获得最佳性能。我不太确定从这里攻击的正确方法是什么。

提前致谢。

4

5 回答 5

2

看起来这个问题已经在这里解决了:

https://github.com/nesquena/rabl/issues/142#issuecomment-2969107

通过使用 object false 并将对象分配给这样的数组:

object false
child @cars.to_a do
extends "api/v1/cars/car"
end
于 2012-10-18T22:46:38.520 回答
0

你厌倦了扩展命令吗?检查此链接它将帮助您https://github.com/nesquena/rabl

于 2012-10-18T07:38:01.100 回答
0

解决这个问题的一种方法是缓存片段。

另一种方法是查看为什么includes不起作用。我的印象是它有效(因为我在我的代码库中使用它)。添加您的includes代码,让我们看看我们是否可以解决它。

于 2012-10-18T08:04:04.207 回答
0

不幸的是,我无法想出一种可接受的方式来使用 Rabl 加快速度,所以我不得不让这个端点手动构建响应对象。

于 2012-10-19T19:20:40.267 回答
0

如果您有直接关系,即“属于”关系,则可以采取一种技巧来强制记录预加载。在您的控制器中,您将编写:

@foo = FooModel.all
@foo.bars.size
. . .
render 'foo/view'

即使您有嵌套关系,这也可以:

@foo = FooModel.all
@foo.bars.size
@foo.bars.bazzes.size
. . .
render 'foo/view'

"size" 方法通过它们的关联预加载所有对象,而不是将 rabl 委托给单个查询。

于 2014-01-30T22:36:55.063 回答