Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails记录至少一个与属性值的关联_Ruby On Rails_Ruby On Rails 4_Scope_Rails Activerecord - Fatal编程技术网

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也不推荐,因为在仅使用活动记录规则时会进行优化。想象一下,如果你有很多产品,这条生产线可以让事情变得更慢。