在我的 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 个,以便页面包含来自不同类别的产品?
最佳答案
不太优雅的 ruby 解决方案
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 个或用完产品
关于sql - 限制类别页面上产品列表中子类别的项目数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44333048/