Rails / ActiveRecord控制器样板(调用.all)

时间:2013-12-21 13:09:12

标签: ruby-on-rails activerecord rails-activerecord

我在汽车控制器中有以下样板

class CarsController < ApplicationController

# GET /cars
# GET /cars.json
def index
  @cars = Car.all

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @cars }
  end
end

假设我的数据库中有5万辆汽车。

我的理解是每次调用/cars/index都会查询db(select * from cars),并构建一个对象来存储所有信息。然后Cars视图可以访问@cars,json请求只会得到一个巨大的json响应,包括所有5万辆汽车。

  1. 在我的情况下,这种默认行为听起来像是一个可怕的想法。如果/cars是一个非常受欢迎的页面怎么办?如果我有1000万辆汽车怎么办?
  2. 我在视图(@cars)中没有使用index.html.erb,所以如何验证我不需要 任何json电话? (由于某种原因我不知道Rails需要这个吗? 的?)
  3. 似乎@cars = Car.all是一个非常不酷的代码行,仅用于验证您的新控制器是否正常工作,并且可能应该在开始时删除。正确?

2 个答案:

答案 0 :(得分:1)

通常你不应该在一个页面上显示所有“汽车”。在显示结果之前应进行一些过滤。最普遍的解决方案是对大型数据集的结果进行“分页”。根据实现,这应该在从数据库中提取实际对象之前发生。

看看

https://github.com/mislav/will_paginate/wiki

答案 1 :(得分:1)

而不是全部,您应该使用@car = Car.scoped。它将返回一个活动的记录关系,只有在需要时才会延迟加载汽车对象。高效记忆。

例如,如果您只需要来自@cars变量的30辆汽车,而该@cars.limit(30)变量应该包含数据库中的所有汽车,@cars = Car.all将仅加载那些汽车。

另一方面,如果您使用@cars[0..29]然后尝试@cars,则无论如何都会将所有汽车加载到{{1}}中,这会使内存膨胀。

请原谅我的英语。我发现现在很难直接输入。