如何优化和减少数据库调用?

时间:2012-02-09 14:11:54

标签: mysql ruby-on-rails-3

我正在为一个项目动态计算总数,但它目前是数据库密集型的:

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 个答案:

答案 0 :(得分:2)

我对ruby不太熟悉,但我认为你可以直接从SQL获得最高价格。像这样:

SELECT MAX(price) 
FROM options_packages 
WHERE package_id = "#{package.id}" 
GROUP BY package_id

答案 1 :(得分:1)

我已经更新了价格 - 这对于计算highest_price来说似乎更有效...?

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