2013-12-21 2 views
1

У меня есть следующие шаблонного в контроллере АвтомобилиRails/ActiveRecord контроллер шаблонный (вызов .all)

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 

Допустим, у меня есть 50000 автомобилей в моей базе данных.

Я понимаю, что каждый звонок /cars/index будет запрашивать db (select * from cars) и строить объект для хранения всей этой информации. Тогда у Просмотра автомобилей будет доступ к @cars, и запрос json просто получит гигантский ответ json, включая все 50 тыс. Автомобилей.

  1. Это поведение по умолчанию звучит как ужасная идея в моей ситуации. Что, если /cars очень популярная страница? Что, если бы у меня было 10 миллионов автомобилей?
  2. Я не использую @cars на вид (index.html.erb), так как я могу проверить, что мне не нужны любые звонки json? (НОО Rails это нужно по какой-то причине я нахожусь не знают из?)

Кажется, что @cars = Car.all очень клево строка кода используется только для проверки того, что ваш новый контроллер работает, и, вероятно, следует удалить право в начале. Правильно?

ответ

1

Обычно вы не должны отображать все «Автомобили» на одной странице. Перед отображением результатов должна произойти некоторая фильтрация. Наиболее распространенным решением будет «разбиение на страницы» результатов для больших наборов данных. В зависимости от реализации это должно произойти до того, как фактический объект будет извлечен из базы данных.

посмотреть на

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

+0

/cars/index не показывает никаких автомобилей вообще. Это означает, что я могу удалить строку '@cars = Car.all' и сэкономить много ресурсов, не так ли? – Patrick

+1

Да. Если вы ничего не сделаете с ними, вы просто удалите их. Имейте в виду, что Rails scaffolding показывает вам, как делаются вещи, но действия контроллера, такие как «index», должны/не могут использоваться в производственных системах (больших db). – Max

+0

Спасибо Макс. Как узнать, используется ли json-аспект? Если бы мне понадобилось '@ cars' для json, могу ли я поместить линию Car.all внутри фигурных скобок format.json? – Patrick

1

Вместо всего, вы должны использовать @car = Car.scoped. Он вернет активное отношение к записи, которое будет лениво загружать автомобильные объекты только тогда, когда они понадобятся. Высокая память.

Например, если вам нужна только тридцать автомобилей из переменной @cars, которая должна иметь все автомобили в базе данных, @cars.limit(30) будет загружать только те многие.

С другой стороны, если вы использовали @cars = Car.all, а затем попробовать @cars[0..29], все машины загружаются в @cars в любом случае, который будет раздувать память.

Извините, мой английский. Мне трудно набрать прямо сейчас.

+0

", который раздует память" Это то, чего я пытаюсь избежать. Поскольку я даже не использую '@ cars' в представлении, лучше всего просто удалить вызов Car.all. – Patrick

+0

Что именно вам нужно для действия индекса, если не индексировать автомобили? –

+0

Если вы не хотите использовать html-представления, просто замените весь блок response_to на 'render json: @ cars'. Предполагается, что вы хотите установить это как api. –

Смежные вопросы