Как ускорить запросы контроллера рельсов? - PullRequest
0 голосов
/ 09 января 2020

Мое приложение кажется застрявшим. Может кто-нибудь может помочь мне оптимизировать этот код контроллера для более быстрой работы? Или укажи мне правильное направление. Я пытаюсь отобразить список клиентов, которые определены как active, и true, а список потенциальных клиентов, которые являются false. Заархивированные клиенты заархивированы верно. Спасибо.

if current_user.manager?
  get_customers = Customer.where(:archived => false)
  @cc = get_customers.where(:active => true)
  @current_customers = @cc.where(:user_id => current_user.id)
  @count_current = @current_customers.count

  @pc = get_customers.where(:active => false)
  @potential_customers = @pc.where(:user_id => current_user.id)
  @count_potential = @potential_customers.count
end

Как это выглядит для улучшения скорости?

модель

scope :not_archived, -> { where(:archived => false) }
  scope :current_customers, -> { where(:active => true).not_archived }
  scope :potential_customers, -> { where(:active => false).not_archived }
  scope :archived_customers, -> { where(:archived => true) }

Контроллер

 @current_customers = Customer.current_customers.includes(:contacts,:contracts)

Просмотр

link_to "Current Clients #{@count_current.size}"

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Вы можете найти справку здесь

Как указал @Gabbar, и я добавлю к нему, ваше приложение сейчас eager-loading (противоположно отложенная загрузка ), что означает, что вы загружаете из базы данных больше, чем нужно. Что нам нужно сделать, так это оптимизировать, но это полностью зависит от вашего варианта использования.

Независимо от варианта использования, вы можете сделать несколько общих вещей, чтобы сделать вещи лучше: Вы можете реализовать нумерацию страниц (есть гемы для это и вы тоже можете сделать сами) или бесконечная прокрутка. В этом случае вы сначала будете загружать определенное количество записей из БД, но как только пользователь захочет больше, он либо прокрутит вниз, либо нажмет кнопку «Далее», и ваше действие будет вызвано снова, но с шагом на странице. число, которое означает получение следующего набора записей.

Реализация на основе прокрутки включает JS и view-height et c. но нумерация страниц намного проще.

Драгоценные камни:

камень каминари

бесконечные страницы

Использование includes

Еще одна вещь, которую вы должны сделать, это использовать включить в запрос, если ваши записи связаны между собой. Использование include сложно, но очень полезно для экономии времени. Он будет извлекать необходимую нужную запись вместе в одной go из базы данных, в отличие от того, как ваш код отправляется туда и обратно в базу данных несколько раз. Выборка из базы данных занимает много времени по сравнению с выборкой из ОЗУ.

@users = User.all.includes(:comments) #comments for all users brought along with users but saved in RAM for future access.
@comments = @users.map(&:comments) # no need to go to db again, just RAM.

Использование scopes в моделях:

Создание областей в моделях также помогает. В вашем случае вы должны создать такие области:

  scope :archived_customers, -> { where('archived IS false') }
  scope :potential_customers, -> { where('active IS false') }

  **OR**

  scope :archived_customers, -> { where(:archived => false) }
  scope :potential_customers, -> { where(:active => false) }
1 голос
/ 09 января 2020

Загрузка всех доступных записей в одном запросе может быть очень дорогой. Более того, пользователь может быть заинтересован только в нескольких самых последних записях (т. Е. В последних публикациях в блоге) и не хочет ждать загрузки и отображения всех записей.

Есть пары способы решения этой проблемы

пример # 1 реализации Загрузить еще

пример # 2 реализации Бесконечная прокрутка

Пример # 3 реализации разбиение на страницы

...