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

时间:2018-09-12 20:58:37

标签: ruby-on-rails ruby-on-rails-4 scope rails-activerecord

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

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

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

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

但这只会拉动所有现有products均已全部付款的购买。我可以代替所有拥有至少1个全款商品的购买吗?

2 个答案:

答案 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)

我认为可能还有其他方式