Rabl 1+N Queries и медленная загрузка просмотра

У нас есть представление 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 секунд и включает около 30 дополнительных запросов на foo запись. Я пытался использовать синтаксис includes для предварительной загрузки связанных строк, чтобы Rabl не нужно было их перезагружать, но, похоже, он просто игнорирует отправленную информацию.

Я ищу идею о том, как я могу оптимизировать эту операцию, чтобы мы могли получить от нее максимально возможную производительность. Я не совсем уверен, как правильно атаковать отсюда.

Заранее спасибо.


person EricBoersma    schedule 17.10.2012    source источник
comment
Какой у тебя includes? Показывает ли консоль сервера предварительную выборку ассоциаций в начале?   -  person lulalala    schedule 18.10.2012


Ответы (5)


Похоже, что этот вопрос был решен здесь:

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

используя объект false и назначая объект массиву следующим образом:

object false
child @cars.to_a do
extends "api/v1/cars/car"
end
person MattH    schedule 18.10.2012
comment
Глядя на добавление этого. Выглядит многообещающе. Спасибо. - person EricBoersma; 19.10.2012
comment
К сожалению, мне не удалось заставить это работать с нашими представлениями (не знаю почему, но я не смог отобразить какие-либо данные). К сожалению, у нас не так много времени, поэтому мне пришлось просто вручную построить хэш, содержащий ответ для этой единственной конечной точки. - person EricBoersma; 19.10.2012

Вы устали расширять команду? проверьте эту ссылку, она поможет вам https://github.com/nesquena/rabl

person yasir hashmi    schedule 18.10.2012

Одним из способов решения этой проблемы является кеширование фрагментов.

Другой способ — понять, почему includes не работает. У меня сложилось впечатление, что это работает (поскольку я использую его в своей кодовой базе). Добавьте свой код includes и посмотрим, сможем ли мы в нем разобраться.

person lulalala    schedule 18.10.2012

К сожалению, я не смог придумать приемлемого способа ускорить работу с помощью Rabl, поэтому мне пришлось заставить эту конечную точку создавать объект ответа вручную.

person EricBoersma    schedule 19.10.2012

если у вас есть прямое отношение, то есть отношение «принадлежит», есть трюк, который вы можете сделать, чтобы принудительно загрузить записи. В вашем контроллере вы должны написать:

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

Даже если у вас есть вложенные отношения, это будет работать:

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

Метод "размер" предварительно загружает все объекты по их ассоциациям, а не делегирует рабль отдельным запросам.

person eggmatters    schedule 30.01.2014