我们有一个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不需要重新加载它们,但它似乎只是忽略了发送的信息。
我正在寻找一个关于如何优化此操作的想法,以便我们可以从中获得最佳性能。我不太确定从这里进行攻击的正确方法是什么。
提前致谢。
答案 0 :(得分: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
答案 1 :(得分:0)
你累了扩展命令吗?检查此链接,它会对您有所帮助https://github.com/nesquena/rabl
答案 2 :(得分:0)
解决此问题的一种方法是cache碎片。
另一种方法是查看为什么includes
不起作用。我觉得它有效(因为我在我的代码库中使用它)。添加您的includes
代码,让我们看看我们是否可以解决这个问题。
答案 3 :(得分:0)
不幸的是,我无法想出一种可以接受的方法来加快使用Rabl的速度,因此我不得不手动构建这个响应对象。
答案 4 :(得分: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委托给单个查询。