0

我正在构建一个餐厅应用程序,它允许餐厅在线创建菜单。现在我们的页面在初始页面加载时加载了 6 个项目,然后无限滚动交互接管,因为他们继续向下滚动页面并通过 AJAX 动态加载另外 6 个项目。

一切正常,但我无法限制我的数据库关联的字段。例如,我的物品有自己的尺寸,这些尺寸是在物品模型中建立的

has_many :sizes

然后我使用

item.sizes

为了组织我的数据以通过 json 返回,我使用以下方法(尽管我非常欢迎这种方法的改进):

items = Item.where("blah blah")
items.each do |item|
    item[:sizes] = item.sizes
end

render :json => {:items => items}

所有这些都有效并且足够简单,但是当我尝试限制从数据库返回的选定列时,我开始出现奇怪的行为。我不确定是什么原因造成的。我试过这样做:

item[:sizes] = item.sizes.select("id, name, price")

我也尝试过这样做:

item[:sizes] = item.sizes.to_json(:only => [:id, :name, :price])

这两种方法都只能在服务器端返回请求的字段,但是在请求和返回到 Web 浏览器之间似乎发生了一些事情(我的猜测是它是由 render 方法引起的),这似乎是撤消我唯一的字段选择器,而是发回所有数据库数据(因此,我收到的不仅仅是 id、name、price,而是大约 20 个不必要的数据字段)。

我正在寻找任何可能有助于完成这项工作的建议。此外,如果有人有任何其他关于改进查询时间的方法的信息,那也将不胜感激。我已经涵盖了所有基本教程,并且在访问项目之前已经使用了预加载(我想知道这是否与我的问题有关?),但我正在努力寻找好的解决方案来防止造成瓶颈通过这些 to_json 和 render :json 方法。

目前,在数据库上需要大约 400 毫秒的一系列查询在 render :json 中需要额外的 1000 毫秒。

4

1 回答 1

1

您应该通过将参数传递给这样的render方法来限制元素:

render :json => items.to_json(:include => { :sizes => { :only => [:id, :name, :price] }}

这应该为你做。

于 2013-07-28T21:43:16.687 回答