0

考虑我有 15 个类别,每个类别有 6 个子类别,现在我有项目表,我必须根据最新购买日期从每个子类别中找到 3 个项目。

category 1 ---> level 1 ---> 3 items with latest date
category 1 ---> level 2 ---> 3 items with latest date
  ...
  ...
  ...
category 15 ---> level 5 ---> 3 items with latest date
category 15 ---> level 6 ---> 3 items with latest date

我努力了

@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 => 'created_at DESC', :limit => 3)
            array.each do |value2|
                   @latest_item_of_each_customer << value2
            end
          end
        end

这将作为 15 个类别 x 6 个子类别重复 90 次,因此需要很长时间。请告诉我如何通过有效的查询来减少时间。

4

2 回答 2

0

1)第一件事是...... item 表中 category_id 的用途是什么,因为我们已经有了 sub_category_id,并且从 sub_category 我们可以获取类别,并且您想要每个子类别的项目。

  @latest_item_of_each_customer = []
  @sub_categories = SubCategory.all

  @sub_categories.each do |value1|
    @latest_item_of_each_customer << Item.find(:all, :conditions => ["customer_id IN (?) and sub_category_id = ?", @customer, value1.id], :order => 'created_at DESC', :limit => 3)
  end

  @latest_item_of_each_customer  = @latest_item_of_each_customer.flatten 
于 2013-05-22T08:42:25.367 回答
0

根据您要提取的数据集的大小,加速这样的嵌套循环的一种方法是急切加载其中一些关联。

@categories = Category.all(:include => :sub_categories)

这应该会减少您进行的查询量,从而提高性能。

如果您想了解更多有关急切加载的信息,请查看此http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations

于 2013-05-22T08:20:41.083 回答