因此,由于 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 将以相反的顺序返回它们。
现在的问题是,如何从列表中获取旧卡?正如另一个答案所说,ID 是时间戳,因此我们只需按 ID 排序并选择最低的一个并继续分页。
注意:如果您速度很快,您可以在同一秒内创建多张卡片,因此 ID 的顺序可能不正确,因为它们只使用秒数,而不是微秒。但这并不妨碍我们分页。
board.cards(limit: 5, before: '56af533fc1775129aaa7028b').map { |c| [c.name, c.id] }
=> [
["D", "56af53397bf672bb56c7c536"],
["E", "56af5339f5e67cf6bcc7323b"],
["F", "56af533ac0aa02de54ab881a"],
["G", "56af533b212b095266ebb506"],
["H", "56af533e11992f20f375fca1"]
]
太棒了,我们正在获取下一页,让我们获取最后一页。
board.cards(limit: 5, before: '56af53397bf672bb56c7c536').map { |c| [c.name, c.id] }
=> [
["A", "56af53367f15b163c0e345fd"],
["B", "56af533783d4fccc1cce3941"],
["C", "56af533831727db409451c9e"]
]
是的,所以最后一页包含的卡片少于限制,所以我们知道它是最后一页。万岁! (如果它等于页面大小,我们会发现下一个响应是空的)