response = RestClient.get 'https://www.google.com/m8/feeds/contacts/default/full', {params: {'max-results': 10000, 'access_token' => access_token, 'alt' => 'json', 'sortorder' => 'ascending'}}
我正在使用谷歌API来获取他们在sortorder
或ascending
文档中提供descending
的联系人,但我无法弄清楚他们正在排序哪个属性,我想在名称上做到这一点
参考:https://developers.google.com/google-apps/contacts/v3/reference
任何帮助??
编辑: 另外,我想对联系人进行分页,如果我在ROR端处理这种排序,那么我每次都需要获取数千个联系人并对它们进行排序然后分页,这很慢
答案 0 :(得分:3)
似乎此Google API不支持按名称排序,这意味着分页成为一项挑战。
如果我被困在这上面,我可能会抓住完整的联系人列表,并将其保留在任何一个中
(a)磁盘文件或
(b)Memcached或Redis,或者
(c)数据库表。
当然,在持久化对象时会出现其他问题,主要是为您的代码定义好的参数,以便知道何时重新同步列表,或者简单地将其扔掉。
如果选择(c),则可以通过典型方式完成排序和分页。
但是如果您选择(a)或(b),那么您可以在保存列表时进行排序。
Ruby可以轻松地对加载到内存中的数组进行排序。如果它是一个大阵列,你甚至可以对它进行排序以避免重复它。我不确定您的response
对象是什么样的,但是这里有一些代码假设它是一个带有name
属性的对象数组。
my_objects = response # ...or whatever extracts the array of objects
# Modifies array in place...
my_objects.sort! { |a, b| a.name <=> b.name }
# To sort descending...
my_objects.sort! { |a, b| b.name <=> a.name }
# To sort by zip first (assuming a `zip` attr) then by `name`...
my_objects.sort! { |a, b| 2 * (a.zip <=> b.zip) + (a.name <=> b.name) }
# To sort by zip first (assuming a `zip` attr) then by `name` DESCENDING...
my_objects.sort! { |a, b| 2 * (a.zip <=> b.zip) + (b.name <=> a.name) }
这一切都有效,因为 signum 或太空船运算符<=>
。你可以在这里了解更多相关信息:
What is the Ruby <=> (spaceship) operator?
https://en.wikipedia.org/wiki/Sign_function
答案 1 :(得分:2)
Contacts API没有直接支持。
orderby
param只有两个选项:“lastmodified”并将其留空(通过使用联系人ID顺便执行确定性但任意的顺序)。
这样做的原因通常是列表操作仅用于同步目的,其中客户端/应用程序将保留其定期更新的本地副本(而不是每次用户打开应用程序或更改时调用API)查看不同的联系人页面)。此外,有几十种方法可以对名称进行排序(名字或姓氏作为主键?标题怎么样?FileAs值?CJK注意事项?)
您是否考虑过使用People API?它为此目的返回带有联系人的排序键。