Rails 记录至少一个与属性值关联的地方

Rails record where at least one association with attribute value

我有一个模型 Purchase has_many products。我想提取所有 purchases,其中至少有一个 product 已经全额支付。

Product 有一个 status,其中 status 4 表示已全额支付。

我尝试在 Purchase 模型中定义范围:

scope :full_paid, -> {
  joins(:products).where(products: { status: 4 })
}

但这只会提取所有现有 products 已全额支付的购买。我可以取而代之的是提取至少有 1 个全额付款产品的所有购买吗?

我认为这可以做到,但我不确定这是最好的方法:

Product.where(status: 4).map{|prod| prod.purchase}.uniq

有几种方法可以这样做:

1) 使用 left_outer_joins 计数如下:

scope :full_paid, -> {
  left_outer_joins(:products)
      .select("purchase_id, COUNT(CASE WHEN products.status= 4 THEN 1 ELSE 0 END) as paid")
      .having("paid > 0")
      .group("products.purchase_id")
}

2) 类似于 @John Skiles Skinner 的回答,但有一些变化,添加 group 以获得 unique purchases 来自 数据库端

Product.select(:purchase_id).where(status: 4).group(:purchase_id)

我想可能还有其他方法