如何在rails中有效地执行查询?

log*_*esh 6 performance ruby-on-rails query-optimization ruby-on-rails-3

考虑我有15个类别和6个子类别,我有表项目,我有一组记录,我必须以下面的方式获取

category 1 ---> level 1 ---> 3 items with maximum price
category 1 ---> level 2 ---> 3 items with maximum price
  ...
  ...
  ...
category 15 ---> level 6 ---> 3 items with maximum price
Run Code Online (Sandbox Code Playgroud)

@categories.each do |value|
   @sub-categories.each do |value1|
      array = Item.find(:all, :conditions => ["customer_id IN (?) AND category_id = ? AND sub-category_id = ?", @customer, value.id, value1.id], :order => 'price DESC', :limit => 3)
            array.each do |value2|
                   @max_price_item_of_each_customer << value2
            end
          end
        end
Run Code Online (Sandbox Code Playgroud)

但这会花费很多时间,因为这会迭代.那么我怎样才能以这种方式改变这个时间呢?任何帮助表示赞赏.

Mat*_*hew 2

这一切都取决于您正在使用的记录的规模,但如果您正在使用合理的记录集,这应该会更快,并将您的查询次数减少到 1。

@customer_id = 1
@categories  = [1, 2, 3]
@subs        = [4, 5, 6]

@max_price_item_of_each_customer = []
items = Item.where(customer_id: @customer, category_id: @categories, subcategory_id: @subcategories)
items.group_by{|item| item.category_id}.each_pair do |category_id, category_items|
  category_items.group_by{|item| item.subcategory_id}.each_pair do |subcategory_id, subcategory_items|
    @max_price_item_of_each_customer += subcategory_items.sort{|x, y| y.price <=> x.price }.first(3)
  end
end
Run Code Online (Sandbox Code Playgroud)