Как разделить отношения между данными и данными

Как вы разбиваете запрос на связанные данные? Например, если у моего Person есть прикрепленные к нему тысячи Задачи, если я сделаю следующее: в RESTful мышлении я бы получил все из них.

var tasks = person.get('tasks');

Это будет слишком много данных. Как заставить параметр запроса на запрос, который работает за кулисами? Идеально для конечной точки с чем-то вроде этого, прикрепленного к концу.

?&offset=3&limit=3

Вот fiddle, чтобы проиллюстрировать, что я пытаюсь выполнить в IndexController. Я понятия не имею, что "разумный способ" состоит в том, чтобы делать разбитые на страницы запросы с использованием данных ember.

Ответы

Ответ 1

Это не существовало, когда этот вопрос был впервые задан, но теперь есть аддон под названием ember-data-has-many-query, который, по-видимому, способен на это, по крайней мере, для RESTAdapter и JSONAPIAdapter. Похоже, что у него есть некоторые причуды из-за данных ember-данных, которые еще не поддерживают разбивку на страницы как первоклассную концепцию. Если это вас беспокоит, всегда есть store.query, но для этого требуется, чтобы ваш API поддерживал (в вашем примере) параметр фильтра person_id на конечной точке /tasks.

по теме:

(похоже, что этот вопрос не связан с JSON API, но обсуждение имеет значение)

Ответ 2

Как и сегодня, по-прежнему нет способа по умолчанию для разбиения на страницы в ember.

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

Это можно сделать с помощью .query({page:3}), но приводит к некоторым проблемам:

  • Это хорошее решение для классической разбивки на страницы, но для бесконечного прокрутки вам все равно нужно вручную объединить результаты.
  • Результаты не кэшируются, поэтому перемещение вперед и назад по разбитому списку приводит к множеству запросов. Иногда это необходимо, если список доступен для редактирования, но часто его нет.

Для второй проблемы я создаю небольшой аддон под названием ember-query-cache, который подключается к хранилищу и позволяет кэшировать результаты запроса. Очень короткая демонстрация доступна здесь.

Теперь, если мы поговорим об отношениях, я бы честно рекомендовал использовать верхний уровень .query, пока у вас не будет лучшей поддержки непосредственно из данных ember-данных:

store.query('task', { person: get(person, 'id'), page: 3 }

В этом нет ничего плохого. Вы получаете свой результат и имеете отношения в другом направлении. Он работает без каких-либо взломов в ember-data, поскольку вам не нужно кэшировать, и если вам нужно кэшировать, это требует очень небольшого количества хакеров, которые я сделал в своем приложении.

Мы все еще надеемся, что данные ember-данных станут полностью завершенными JSONAPI, и для этого потребуется разбиение на страницы. Я думаю, что с точки зрения API лучше всего будет иметь возможность запрашивать следующую и предыдущую страницу в ManyArray, возвращаемые этими отношениями. Это будет вместе с JSONAPI, где предоставляется следующая и предыдущая ссылка. Но для того, чтобы понять, что теперь вам придется взломать данные в ember-данные, не получая большого улучшения над верхним уровнем .query, который я успешно использовал во многих проектах.

Ответ 3

В руководствах Ember.js по использованию моделей вы также можете отправить запрос вместе с вызовом find().

this.store.find('person', { name: "Peter" }).then(function(people) {
  console.log("Found " + people.get('length') + " people named Peter.");
});

Из руководства:

Хэш параметров поиска, который вы переходите на find(), непрозрачен для Ember Данные. По умолчанию эти параметры будут отправлены на ваш сервер в качестве тело запроса HTTP GET.

Использование этой функции требует, чтобы ваш сервер знал, как интерпретировать ответы на запрос.