在JSON对象中存储数据以避免多次调用

时间:2011-10-17 06:15:46

标签: ruby-on-rails json

在实施此功能的过程中,我想获得一些建议。

当用户登陆我的网站上的这一页时,我从linkedin(通过API调用)获得用户的连接。现在我需要在我的页面10个连接上一次显示这些连接以进行进一步处理。在最初加载前10后我想给用户一个选项来加载10个连接(通过按一个按钮),然后再加载10个等等。

我正在考虑以这样的方式实现这一点:当用户到达页面时,我进行API调用,一次获取所有连接,将它们全部存储到JSON对象中,然后显示第一个10.如果用户请求下一个10,然后我从JSON对象中读取下一个10。

这是我实现此寻呼能力的最佳方式吗?使用JSON对象是一种很好的方法吗?注意,这里的想法是防止发出多个API调用,因为Linkedin有每日限制。感谢。

1 个答案:

答案 0 :(得分:0)

我喜欢这种方法,尤其是像Autocomplete这样的东西,每次用户进行击键时都会有服务器端请求。我注意到它在我的服务器上施加了很大的压力(因为自动完成功能几乎全天候在应用程序上使用)。所以我将使用我的代码中的一个例子来适应你。这是为了进入播放列表。

我的PlaylistEntriesController中有一个名为playlist的动作,它响应JS:

  def playlist
    @all_playlist_entries = PlaylistEntry.scoped # just a dump of all the playlist entries for autocomplete
  end

然后在playlist.js.erb

<% cache 'playlist_entries', :expires_in => '1.day' do %>
    var titles = <%=raw @all_playlist_entries.map(&:title).uniq.to_json %>
    var artists = <%=raw @all_playlist_entries.map(&:artist).uniq.to_json %>
    var albums = <%=raw @all_playlist_entries.map(&:album).uniq.to_json %>
    var autocomplete_options = { delay: 100, autoFocus: true, minLength: 3 };
<% end %>

然后我只是将这些javascript变量作为自动完成的“源”传递。这是快速的(用100,000个条目测试,数据库响应时间大约是4秒,实际的自动完成几乎是立即的),甚至更好,它每天只需要一次调用数据库,因为它是缓存的,而不是THOUSANDS。当然,缺点是新的条目要到第二天才能提供,但在我看来这不是一个大问题。

所以这并不是你如何实现它,但它会起作用。您可以调用LinkedIn API并将结果作为json对象存储在javascript数组中(使用to_json,如果需要,可以在模型中覆盖)。然后有一个链接显示Show 10 more,它会做一些jQuery魔术来显示接下来的10个(我不能做到这一点,但这将是一个问题,找出有多少显示,使用javascript变量或在每个DIV上将数字存储为data-attributeid,然后在数组中获取下一个10)。