如何更快地使Rails as_json

时间:2015-07-08 17:37:57

标签: ruby-on-rails

我正在使用Rails上的REST服务器,用户可以与其他用户建立友谊关系。为了表示这种关系,我使用的是“友谊”连接表,它具有“状态”属性,用于指示关系是否已被接受,拒绝,取消或待处理。

在我的用户模型上,我有类似的内容:

has_many :friendships
has_many :friends, -> { where(friendships: {status: 2})}, through => :friendships
has_many :requests, -> { where(friendships: {status: 1})},
                   :class_name => "Friendship", :foreign_key => "friend_id"
has_many :pending_friends, :through => :requests, :source => :user

和其他几个表示反向的关系(当用户是那个要求的那个时)。在我的友谊模型上:

belongs_to :user
belongs_to :friend, :class_name => "User"

现在我要做的是提供一个服务,用户可以检查他所有的友谊和友情请求,当然还有其他用户的一些数据,所以我不必为此做额外的请求。所以我正在做的是:

friendships = current_user.friendships.where(status: 2).includes(:friend)
              .as_json(include: {friend: {only: [:id, :username, :photo_url]}})

requests = current_user.requests.includes(:user)
           .as_json(include:  {user: {only: [:id, :username, :photo_url]}})

render json: {friendships: friendships, requests: requests}, status: 200

现在我一直在测试,当用户有1000个友情关系时,加载它可能需要5秒钟。但是,如果我从only: [:id,..]中删除as_json,它将在1秒内运行,但它将拥有所有用户的信息。如果我完全移除as_json它将在0.4秒内运行,但我只会获得友谊的信息,并且不会包含其他用户的信息。

为了记录我在Laravel上构建相同的应用程序,我应该找出哪种框架/语言最适合我们的情况。在那个Laravel应用程序中,由于ORM在数组结构中构建对象并允许您决定从连接表中带来哪些数据,因此在0.5秒内完成此操作更容易。所以告诉我Rails对我想做的事情并不是那么好,切换到Laravel是我猜的可接受的响应。

1 个答案:

答案 0 :(得分:1)

我们遇到了同样的问题并转而使用OJ(https://github.com/ohler55/oj)。

它比其他引擎更快。 github页面上有一些性能测试

最好的