Ruby on rails Rails记录至少一个与属性值的关联
我有一个型号Ruby on rails Rails记录至少一个与属性值的关联,ruby-on-rails,ruby-on-rails-4,scope,rails-activerecord,Ruby On Rails,Ruby On Rails 4,Scope,Rails Activerecord,我有一个型号Purchase,它有许多产品。我想提取所有购买的,其中至少有一个产品已全额付款 产品具有状态,其中状态4表示已全额支付 我尝试在购买模型中定义范围: scope :full_paid, -> { joins(:products).where(products: { status: 4 }) } 但这只会吸引所有现有产品全额支付的购买。我可以取而代之的是,所有购买至少有一个全额付费产品的产品吗?我认为这样做可以,尽管我不确定这是最好的方式: Product.where(s
Purchase
,它有许多产品
。我想提取所有购买的
,其中至少有一个产品
已全额付款
产品
具有状态
,其中状态4
表示已全额支付
我尝试在购买
模型中定义范围:
scope :full_paid, -> {
joins(:products).where(products: { status: 4 })
}
但这只会吸引所有现有产品
全额支付的购买。我可以取而代之的是,所有购买至少有一个全额付费产品的产品吗?我认为这样做可以,尽管我不确定这是最好的方式:
Product.where(status: 4).map{|prod| prod.purchase}.uniq
有几种方法可以做到这一点:
1) 使用左外连接
,计数如下:
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 answer类似,但需要做一些更改,添加组以从数据库方获得独特的购买:
Product.select(:purchase_id).where(status: 4).group(:purchase_id)
我想可能还有其他方法谢谢你的回答。我接受了另一个答案,因为这对我来说似乎更有效,再次感谢:)而且,在活动记录查询中使用ruby也不推荐,因为在仅使用活动记录规则时会进行优化。想象一下,如果你有很多产品,这条生产线可以让事情变得更慢。