【发布时间】:2011-07-14 03:25:16
【问题描述】:
我试图通过使用 ActiveRecord 3.0.9 减少查询数量来实现。我产生了大约 20 万个“虚拟”客户和 50 万个订单。
以下是模特:
class Customer < ActiveRecord::Base
has_many :orders
end
class Orders < ActiveRecord::Base
belongs_to :customer
has_many :products
end
class Product < ActiveRecord::Base
belongs_to :order
end
当您在控制器中使用此代码时:
@customers = Customer.where(:active => true).paginate(page => params[:page], :per_page => 100)
# SELECT * FROM customers ...
并在视图中使用它(我删除了 HAML 代码以便于阅读):
@order = @customers.each do |customer|
customer.orders.each do |order| # SELECT * FROM orders ...
%td= order.products.count # SELECT COUNT(*) FROM products ...
%td= order.products.sum(:amount) # SELECT SUM(*) FROM products ...
end
end
但是,页面呈现为每页 100 行的表格。问题是加载速度有点慢,因为它会为每个客户的订单触发大约 3-5 个查询。加载页面大约需要 300 个查询。
还有其他方法可以减少查询次数并更快地加载页面吗?
注意事项:
1) 我曾尝试使用includes(:orders),但它包含超过200,000 个order_id。这就是问题。
2) 它们已被编入索引。
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 activerecord