2013-09-23 2 views
0

У меня возникли проблемы с производительностью приложения моих рельсов. Это может быть следствием плохой структуры базы данных. И страница часто просматривается пользователями, учитывая, что запись составляет 5k +.Лучший способ записи запросов

Current System: 

Model: 
person has_many payment 

Controller: 
@total_payments = 0 
person.each do |p| 
    @total_payments += p.payments.map(&:value).sum 
end 

View: 
@total_payments 
  • ли лучше иметь отдельную базу данных для счетчика, чем искать и считать по записям?
  • какую структуру данных вы рекомендуете/совет?
+0

Что такое 'person.each'? Думаю, это должно быть 'people.each'? Кроме того, это контроллер платежей? –

+1

Попробуйте использовать 'mini-profiler' в своей базе данных, чтобы узнать, как все происходит в вашей базе данных. Вы также можете сделать «Rails.cache.fetch» ​​и «memcache» или «dahli | memcache» сумму платежа. Это увеличит вашу память, но обеспечит более быстрый опыт. – kobaltz

+0

Спасибо. Я попробую мини-профайлер, а затем сделаю memcache – fujisan

ответ

2

Предполагая persons является ActiveRecord отношение

persons.joins(:payments).sum(:value) 

Если persons является массивом уже (менее предпочтительным)

Payment.where(:person_id => persons.map(&:id)).sum(:value) 

Если общая оплата - это единственная потребность в атрибутах связанных платежей в этом представлении. Тогда самым быстрым способом было бы сделать total_payments поле в таблице person. Обновляйте его каждый раз, когда выполняется связанное с ним payment. Что-то похожее на счетчик кеша. Тогда вам не нужно будет делать sql-запрос для платежей вообще.

0

Вы можете попробовать сделать что-то вроде Payment.select ('value') в качестве базового запроса, чтобы вместо этого вы выполняли только один запрос и сопоставление.

0

Не могли бы вы попробовать

@total_payments += p.payments.pluck(:value).sum

Это будет только выбрать value от каждого платежа, а не всех полей в таблице. Таблицы индексируются на person_id в таблице Payment? Это также поможет ускорить работу базы данных.

(на мобильный атм поэтому не может погружаться гораздо глубже)

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