Google通讯录API:如何按名称

时间:2017-04-11 20:15:21

标签: ruby-on-rails ruby google-contacts

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来获取他们在sortorderascending文档中提供descending的联系人,但我无法弄清楚他们正在排序哪个属性,我想在名称上做到这一点

参考:https://developers.google.com/google-apps/contacts/v3/reference

enter image description here

任何帮助??

编辑: 另外,我想对联系人进行分页,如果我在ROR端处理这种排序,那么我每次都需要获取数千个联系人并对它们进行排序然后分页,这很慢

2 个答案:

答案 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?它为此目的返回带有联系人的排序键。