【问题标题】:Rails record where at least one association with attribute valueRails 记录其中至少一个与属性值的关联
【发布时间】:2018-09-12 20:58:37
【问题描述】:

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

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

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

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

但这只会拉动所有现有products 已全额支付的购买。我可以改为撤消所有至少有 1 件全额付款产品的购买吗?

【问题讨论】:

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


    【解决方案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 获得 unique purchase侧面

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

    我认为可能还有其他方法

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的回答。我接受了另一个答案,因为这对我来说似乎更有效率,再次感谢:)
      • 此外,不建议在活动记录查询中使用 ruby​​,因为仅使用活动记录规则时会进行优化。想象一下,如果你有很多产品,这条线会让事情变得更慢。
      猜你喜欢
      • 2014-02-11
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多