限制类别页面上产品列表中子类别的项目数量?

时间:2017-06-02 15:58:48

标签: sql ruby-on-rails ruby postgresql activerecord

在我的rails 4.2应用程序中,我显示属于属于一个类别的几个不同子类别的页面中的项目列表。我也在子类别的页面上显示列表项。在所述的类别页面上,我想显示每个所属子类别中的最新5个项目,我不会仅显示属于一个类别的所有项目,这是通过以下查询进行的。

我的分类模型

has_many :products, through: :subcategories

我的子类别模型

has_many :products, dependent: :destroy
belongs_to :category, touch: true

我当前的查询

@products = @category.products.published.relevant(Time.zone.today).recent
                           .includes(:subcategory).limit(80)

如何构建查询以将子类别中的产品限制为5,以便该页面包含来自不同类别的产品?

1 个答案:

答案 0 :(得分:0)

不太优雅的红宝石解决方案

products_count = 0
subcatagories_count = {}
@products = []
category.
  products.published.
  relevant(Time.zone.today).
  recent.includes(:subcategory).
  find_each(batch: 80) do
    subcatagories_count[product.subcatagory_id] ||= 0
    if subcatagories_count[product.subcatagory_id] < 5
      @products << product
      products_count += 1
      subcatagories_count[product.subcatagory_id] += 1
      break if products_count >= 80
    end
end
  • 一次加载80个。
  • 循环浏览并将它们添加到@products 如果子目录id已经使用过5次
  • 选择80个产品后离开循环。
  • 如果前80个匹配,只会从数据库加载一次。
  • 还会继续搜索,直到找到80或用完产品