Как оптимизировать и уменьшить количество обращений к базе данных? - PullRequest
1 голос
/ 09 февраля 2012

Я вычисляю итоги на лету для проекта, но в настоящее время он требует большой базы данных:

def sub_total(package)
  subtotal = 0.0
  self.quote_items.order("area_id").each do |item|
    subtotal += Unit.find(item.unit_id).highest_price(package)*item.quantity if item.unit
  end
  sprintf("%.2f", sub_total)
end

В модели блока:

def highest_price(package)
  highest_price = 0
  highest_id = 0
  self.options.where("options.id IN (SELECT option_id FROM options_packages WHERE package_id = '#{package.id}')").each do |option|
    if (option.price > highest_price)
      highest_price = option.price
      highest_id = option.id
    end
  end
  Quote.add_margin highest_price
end

На каждой итерации запрашивает базу данных в методе Unit.find.

Как это можно оптимизировать? Буду признателен за любую помощь или совет, чтобы убрать это! В этом проекте используются Rails 3.0.9 и Ruby 1.8.9.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Я не очень знаком с ruby, но я думаю, что вы можете получить максимальную цену напрямую из SQL.Как то так:

SELECT MAX(price) 
FROM options_packages 
WHERE package_id = "#{package.id}" 
GROUP BY package_id
1 голос
/ 09 февраля 2012

Я обновил цену - это кажется немного более эффективным для расчета наивысшей цены ...?

highest_price = self.options.where("options.id IN (SELECT option_id FROM options_packages WHERE package_id = '#{package.id}')").order('price DESC').first.price
Quote.add_margin highest_price
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...