如何在Rails中优化和检查N + 1个DB查询?

时间:2013-02-04 18:30:45

标签: ruby-on-rails postgresql

我相信我有一个N + 1问题,但我想知道是否有人可以提供有关如何优化此问题的任何建议,因为我的代码运行的查询太多了。

控制器/ profit_reports_controller.rb

def weekly
 @sales = Sale.by_category(@category).this_week(@beg_of_week)
 @departments = Department.by_category(@category)
end 

profit_reports / weekly.html.erb

<% @departments.each do |department| %>
  <% @stores.each do |store| %>
    <% @sale = @sales.by_store(store).by_department(department).sum(:amount) %>

模型/ sale.rb

#Associations
belongs_to :store
belongs_to :department

#Scopes
scope :by_category, lambda {|category| where(:category_id => category.id)}
scope :by_department, lambda {|department| where(:department_id => department.id)}
scope :by_store, lambda {|store| where(:store_id => store.id)}
scope :this_week, lambda {|beg_of_week| where(:date_of_sale =>  beg_of_week..beg_of_week + 6.days)}

1 个答案:

答案 0 :(得分:0)

我强烈建议使用Bullet宝石。来自回购:

  

Bullet gem旨在帮助您增加应用程序   通过减少查询的数量来提高性能。它会观看   您在开发应用程序时的查询,并在何时通知您   当你使用渴望时,你应该添加渴望加载(N + 1个查询)   加载不必要的以及何时应使用计数器缓存。

它还会告诉你如何修复它。玩得开心!