我正在使用Trello的API来拉取电路板及其卡片。
我注意到我正在拉的其中一块电路板正在接近千卡,所以我想知道如何对结果进行分页?
我尝试使用since
属性并将最后一张卡片的更新时间输入其中,但之后我得到的结果为零,所以我一定是做错了。
api文档并没有多说,我尝试的API响应非常混乱:
?/板/ XYZ /卡极限= 1&安培;之前= 2015年1月1日
在指定日期之后返回活动为的卡片。
" dateLastActivity" = GT;" 2015-02-03T17:51:23.253Z",
并且我没有其他日期字段可用于继续分页。
答案 0 :(得分:4)
你的评估是正确的。 之前和自参数在卡创建日期运行。因为我们使用标准的Mongo ID,所以您实际上可以从卡ID中获取卡创建日期。 (这是一个这样的工具:https://steveridout.github.io/mongo-object-time/)
为方便起见,Trello还允许您将卡ID传递到之前和之后的参数,我们将为您使用日期。通过大量卡片进行分页的推荐方法是重复相同的查询,并使用这些参数向前或向后移动。
答案 1 :(得分:3)
因此,由于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(限制:1).map {| c | [c.name,c.id]}
=> [["M", "56af534e768610ff67c781ce"]]
Ooops,API返回最后一个元素。绝对出乎意料。让我们玩下一个/之前的。
在最后一张牌之前拿牌。
board.cards(限制:1,之前:' 56af534e768610ff67c781ce')。map {| c | [c.name,c.id]}
=> [["L", "56af534d964b6c4aa93d4aca"]]
效果很好,L
在M
之前。
如果我们在最后一张牌之后拿到一张牌会发生什么,响应应该是空的,对吗?
board.cards(限制:1,之后:' 56af534e768610ff67c781ce')。map {| c | [c.name,c.id]}
=> [["M", "56af534e768610ff67c781ce"]]
嗯,什么?如果我拿到两张卡会怎么样?
board.cards(限制:2,之后:' 56af534e768610ff67c781ce')。map {| c | [c.name,c.id]}
=> [
["L", "56af534d964b6c4aa93d4aca"],
["M", "56af534e768610ff67c781ce"]
]
这违背了任何逻辑。绝对不能从头到尾遍历列表,因为卡列表没有结束。
在这种情况下,我们必须以相反的顺序查看卡片。只需指定limit
即可,因为默认情况下我们会按相反顺序进行操作。 (总的来说,这对吗?)
api.find(:boards,' 56af532ae7a74a5fcac32e66')。cards(限制:5).map {| c | [c.name,c.id]}
=> [
["I", "56af533fc1775129aaa7028b"],
["J", "56af5345f81227a7a1cc3a35"],
["K", "56af5345e36b3d3c45b16967"],
["L", "56af534d964b6c4aa93d4aca"],
["M", "56af534e768610ff67c781ce"]
]
不要让这些物品的顺序欺骗你!它仍然是它们在电路板中出现的顺序,它们不会在创建时排序。如果我在其列中移动M
卡,使其正好在L
之上,则API会以相反的顺序返回它们。
现在的问题是,如何从列表中获取旧卡?正如另一个答案所说,ID是时间戳,所以我们只按ID排序并选择最低的ID并继续分页。
注意:如果你快速,你可以在同一秒内创建多张卡,因此ID可能不是正确的顺序,因为它们只使用秒数,而不是微秒。但这并不妨碍我们进行分页。
board.cards(限制:5,之前:' 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"]
]
Yesss,所以最后一页包含的卡少于限制,所以我们知道它的最后一页。 Horray! (如果它等于页面大小,我们发现下一个响应是空的)