在rails中将大型数据库记录集渲染为JSON

时间:2013-02-28 05:34:23

标签: ruby-on-rails json mongodb mongoid

有没有办法以JSON格式呈现大型记录集而不消耗大量内存?例如,我有以下查询:

...
records = Records.where(query)
respond_to do |format|
  format.html
  format.json  { render :json => records.to_json }
end

有时,记录将包含数千个条目,并且JSON严格用于在不使用分页的情况下获取数据,并且此类数据必须适合内存才能返回。 Record条目还包含很多字段(我使用的是MongoDB / Mongoid),并且必须包含这些字段。

1 个答案:

答案 0 :(得分:1)

返回数据库中的每个资源几乎总是一个坏主意。

您可以使用有限的结果集进行回复,并提供总记录数。

例如:

{
  total: 503
  records: [
    { id: 1 },
    { id: 2 }
  ]
}

并添加使用limitoffset参数迭代所有页面的可能性。

免费电子书Web API Design中有一个名为分页和部分回复的章节描述了它。

我建议你阅读那本书。它只包含30页。

<强> UPD : 在您的情况下,您可以使用limitskip mongoid的方法对结果进行分页。

records = Records.where(query).limit(params[:limit]).skip(params[:offset])
respond_to do |format|
  format.html
  format.json  { render :json => { total: records.count, records: records }.to_json }
end