我有一个Purchase
has_many
的模型products
。我想拉出所有purchases
,其中至少有一个product
已全额支付。
Product
有一个status
,其中status 4
表示已全额付款。
我尝试在Purchase
模型中定义范围:
scope :full_paid, -> {
joins(:products).where(products: { status: 4 })
}
但这只会拉动所有现有products
均已全部付款的购买。我可以代替所有拥有至少1个全款商品的购买吗?
答案 0 :(得分:1)
我认为这可以做到,尽管我不确定这是最好的方法:
Product.where(status: 4).map{|prod| prod.purchase}.uniq
答案 1 :(得分:1)
有几种方法可以做到:
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 可以从 DB中获得唯一购买侧面:
Product.select(:purchase_id).where(status: 4).group(:purchase_id)
我认为可能还有其他方式