【问题标题】:Google contacts API : How to get contacts in sorted order by their nameGoogle 联系人 API:如何按姓名按联系人排序
【发布时间】:2017-04-11 20:15:20
【问题描述】:
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,可以是 ascendingdescending,但我无法弄清楚他们是根据哪个属性排序的,我想在名字上这样做

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

有什么帮助吗??

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

【问题讨论】:

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


    【解决方案1】:

    这个 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) }
    

    这一切都归功于 signumspaceship 运算符 &lt;=&gt;。您可以在这里了解更多信息:
    What is the Ruby <=> (spaceship) operator?
    https://en.wikipedia.org/wiki/Sign_function

    【讨论】:

    • @liole 如果用户有 4000 个联系人并且我必须在我这边处理,那么这需要时间,我正在寻找 google 的支持来解决这个目的
    • sort_by!(&amp;:name) 对于升序排序会更惯用
    • 我已经使用 sort_by 在 ROR 方面实现了这一目标,但我正在寻找更好的方法........现在我正在获得成千上万的联系人并最终对其进行排序显示.....现在我想要分页但每次我必须一次又一次地获取这数千条记录然后只发送分页记录
    • 作为升序的次要注释sort_by! { |a| [a.zip, a.name]} 也会更自然地处理这个问题。
    【解决方案2】:

    联系人 API 对此没有直接支持。

    orderby 参数只有两个选项:“lastmodified”并将其留空(顺便说一句,通过使用联系人 ID 执行确定性但任意顺序)。

    这样做的原因是,通常列表操作仅用于同步目的,其中客户端/应用程序将保留其定期更新的自己的本地副本(而不是在用户每次打开应用程序或更改时调用 API查看不同的联系人页面)。此外,您可以通过多种方式对名称进行排序(名字或姓氏作为主键?标题呢?FileAs 值?CJK 考虑因素?)

    您是否考虑过使用 People API?为此,它会返回带有联系人的排序键。

    【讨论】:

    • 因为http://stackoverflow.com/questions/36386957/google-contacts-api-vs-people-api,我没有考虑过people API,我有什么充分的理由应该为此使用people API吗?我想按他们的名字对记录进行排序
    猜你喜欢
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    相关资源
    最近更新 更多