1

次のような構造で、ネストされた子を持つRailsアクションによって強化されたRablビューがあります。

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

つまり、rabl ビューは次のようになります。

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

Rabl が新しいクエリを実行して、各バー オブジェクトと各 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

Unfortunately, I couldn't come up with an acceptable way to speed things up using Rabl, so I was forced to make this one endpoint build the response object by hand.

于 2012-10-19T19:20:40.267 に答える
0

これに取り組む 1 つの方法は、フラグメントをキャッシュすることです。

もう 1 つの方法は、なぜincludes機能しないのかを確認することです。私はそれが機能するという印象を受けました (コードベースで使用しているため)。コードを追加してincludes、理解できるかどうか見てみましょう。

于 2012-10-18T08:04:04.207 に答える
0

コマンドを拡張するのに疲れましたか?このリンクを確認してくださいhttps://github.com/nesquena/rabl

于 2012-10-18T07:38:01.100 に答える
0

直接的な関係、つまり「所属する」関係がある場合、レコードを強制的にプリロードする方法があります。コントローラーに次のように記述します。

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

ネストされた関係がある場合でも、これは機能します。

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

「サイズ」メソッドは、rabl を個々のクエリに委任するのではなく、関連付けによってすべてのオブジェクトをプリロードします。

于 2014-01-30T22:36:55.063 に答える