Итак, поскольку API действительно не работает так, как вы ожидаете, я по крайней мере документирую это здесь.
Я создал тестовую доску с карточками A
, B
, C
, ..., M
, чтобы протестировать ее.
Во-первых, захват всех карт работает как положено.
api.find(:boards, '56af532ae7a74a5fcac32e66').cards.map { |c| [c.name, c.id] }
=> [
["A", "56af53367f15b163c0e345fd"],
["B", "56af533783d4fccc1cce3941"],
["C", "56af533831727db409451c9e"],
["D", "56af53397bf672bb56c7c536"],
["E", "56af5339f5e67cf6bcc7323b"],
["F", "56af533ac0aa02de54ab881a"],
["G", "56af533b212b095266ebb506"],
["H", "56af533e11992f20f375fca1"],
["I", "56af533fc1775129aaa7028b"],
["J", "56af5345f81227a7a1cc3a35"],
["K", "56af5345e36b3d3c45b16967"],
["L", "56af534d964b6c4aa93d4aca"],
["M", "56af534e768610ff67c781ce"]
]
Примечание: порядок карт определяется не временем их создания, а их появлением на доске слева направо и сверху вниз.
Ограничение
Ладно, пора начинать пагинацию. Давайте возьмем только первую карту, хорошо?
board.cards(limit: 1).map { |c| [c.name, c.id] }
=> [["M", "56af534e768610ff67c781ce"]]
К сожалению, API возвращает последний элемент. Определенно неожиданно. Давайте поиграем с после/до следующего.
До
Давайте возьмем карту перед последней.
board.cards(limit: 1, before: '56af534e768610ff67c781ce').map { |c| [c.name, c.id] }
=> [["L", "56af534d964b6c4aa93d4aca"]]
Это работает хорошо, L
предшествует M
.
После
Что произойдет, если мы возьмем карту после последней, ответ должен быть пустым, верно?
board.cards(limit: 1, after: '56af534e768610ff67c781ce').map { |c| [c.name, c.id] }
=> [["M", "56af534e768610ff67c781ce"]]
Мммм, что? Что произойдет, если я возьму две карты?
board.cards(limit: 2, after: '56af534e768610ff67c781ce').map { |c| [c.name, c.id] }
=> [
["L", "56af534d964b6c4aa93d4aca"],
["M", "56af534e768610ff67c781ce"]
]
Это противоречит любой логике. Тогда точно не получится пройти список от начала до конца, потому что у списка карт нет конца.
Назад к разбивке на страницы
В этом случае нам придется пройтись по картам в обратном порядке. Просто указание limit
работает, так как по умолчанию мы идем в обратном порядке. (что имеет общий смысл, верно?)
api.find(:boards, '56af532ae7a74a5fcac32e66').cards(limit: 5).map { |c| [c.name, c.id] }
=> [
["I", "56af533fc1775129aaa7028b"],
["J", "56af5345f81227a7a1cc3a35"],
["K", "56af5345e36b3d3c45b16967"],
["L", "56af534d964b6c4aa93d4aca"],
["M", "56af534e768610ff67c781ce"]
]
Не позволяйте порядку этих предметов обмануть вас! Они по-прежнему находятся в том же порядке, в котором они появляются на доске, они не сортируются по времени создания. Если я передвину карту M
в ее столбец так, чтобы она оказалась прямо над L
, API вернет их в обратном порядке.
Вопрос теперь в том, как выхватить старую карту из списка? Как говорится в другом ответе, идентификаторы представляют собой отметку времени, поэтому мы просто сортируем по идентификатору, выбираем самый низкий и продолжаем разбивать на страницы.
Примечание. Если вы быстры, вы можете создать несколько карточек в течение одной секунды, поэтому идентификаторы могут быть не в правильном порядке, поскольку они просто используют количество секунд, а не микросекунд. Это не мешает нам разбивать страницы.
board.cards(limit: 5, before: '56af533fc1775129aaa7028b').map { |c| [c.name, c.id] }
=> [
["D", "56af53397bf672bb56c7c536"],
["E", "56af5339f5e67cf6bcc7323b"],
["F", "56af533ac0aa02de54ab881a"],
["G", "56af533b212b095266ebb506"],
["H", "56af533e11992f20f375fca1"]
]
Круто, у нас следующая страница, давайте последнюю.
board.cards(лимит: 5, до: '56af53397bf672bb56c7c536').map { |c| [c.name, c.id] }
=> [
["A", "56af53367f15b163c0e345fd"],
["B", "56af533783d4fccc1cce3941"],
["C", "56af533831727db409451c9e"]
]
Да, значит, последняя страница содержит меньше карт, чем лимит, поэтому мы знаем, что это последняя страница. Ура! (если бы он был равен размеру страницы, мы бы обнаружили, что следующий ответ пуст)
person
hakunin
schedule
01.02.2016
since
. Я нашелfilter
в карточках и списках, но это для другой задачи. - person Marcos Pérez Gude   schedule 05.01.2016