首页 > 解决方案 > 查找关联记录仅具有特定属性值的所有记录

问题描述

假设我有两个模型ProductPayment一个has_many关联。

class Product < ApplicationRecord
  has_many :payments
end
class Payment < ApplicationRecord
  belongs_to :product
end

Paymentmodel 有一个属性paid,它可以是truefalse。我怎样才能找到所有products只有属性设置为payments的?paidfalse

我试过了:

Product.joins(:payments).where(payments: { paid: false }).distinct

但是当我需要所有这些时,它会返回products至少一个在哪里。paymentfalsefalse

标签: ruby-on-railsactiverecord

解决方案


我是Ransack gem的忠实粉丝,它简化了很多查询ActiveRecord

您正在寻找仅支付 false 的产品,因此您可以在 ransack 查询中添加两个子句以实现您想要的结果。

首先安装ransack,然后用它来看看你是否得到你想要的结果

Product.ransack(
  payments_paid_eq: false, 
  payments_paid_not_eq: true)
.result
.distinct

在某些方面,这是一个稍微令人困惑的查询,但实质上您是说返回所有付款为假的产品,而不是返回付款为真的产品。

不使用 ransack gem 的另一种方法如下

Product.joins(:payments)
  .where(payments: {paid: false})
  .where.not(payments: {paid: true})
  .distinct

推荐阅读