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)
我想可能还有其他方法
我有一个模型 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)
我想可能还有其他方法