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

标签 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 个,以便页面包含来自不同类别的产品?

最佳答案

不太优雅的 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/

相关文章:

sql - 如何根据时间戳的年份和月份创建索引?

ruby - 无法在 Windows Ruby 1.9.2 上安装或更新 Ruby bluecloth gem

ruby-on-rails - rails 上的多级选择

ruby - 使用 ActiveRecord 在查询对象中转义参数?

ruby-on-rails - JRuby gem 问题

sql - 如何在 Linq to SQL 表达式中使用 SQL GETDATE() 和 DATEADD()?

sql - 如何将 PostgreSQL 输出保存到文本文件

MYSQL View 和求和字段

ruby-on-rails - Paymill 与 rails 的集成 - 在本地存储 id

ruby-on-rails - 我应该将 View 字符串放入 yaml 文件以便于测试吗?