考虑我有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
这将重复90次作为15个类别x6个子类别,因此需要很长时间。请告诉我如何通过有效查询减少时间。
答案 0 :(得分:0)
根据您所引入的数据集的大小,加速这样的嵌套循环的一种方法是急切加载其中一些关联。
@categories = Category.all(:include => :sub_categories)
这可以减少您正在进行的查询量,从而提高性能。
如果您想了解更多关于热切加载的信息,请查看此http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations
答案 1 :(得分:0)
1)首先是......项目表中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