在Rails中渲染大量的ActiveRecord对象

时间:2012-04-03 14:16:43

标签: ruby-on-rails ruby-on-rails-3 json performance activerecord

我有一些Rails控制器动作以这种方式响应AJAX请求:

books = Book.all
render :json => { :books => books }

这应该相对较快,但是它花费的时间超过5秒,这对于网络上的任何请求来说都太长了。日志看起来像这样:

Completed 200 OK in 5212ms (Views: 2679.7ms | ActiveRecord: 147.7ms)

我不明白当我没有渲染到视图文件时,如何在“视图”中花费2.6秒,或者总共可以花费5212ms。什么花了这么多时间,怎么会加快速度呢?

编辑:在这个特定的请求中返回了大约1000本书,我猜每个都是大约1kb的数据。编辑2:查看控制台中的响应,响应的大小为973kb。

3 个答案:

答案 0 :(得分:2)

您是否尝试过oj更快的json生成?据其作者说:

  

到目前为止,已经实现了比Yajl快2倍的解析速度和写JSON的3倍或更多倍。

也许是一个很好的解决方案?

答案 1 :(得分:1)

参见章节1.3批量检索多个对象:http://goo.gl/UR5B

此外,您可能希望查看急切加载记录。

答案 2 :(得分:0)

一旦预先加载了用于渲染视图的所有模型,就可以优化JSON的生成。你上面的内容(渲染:json => {:books => books})不是很快。

看看这个问题:What is the fastest way to render json in rails

考虑切换到另一种呈现JSON的方式。