如何通过链接关系号进行 qwery 过滤器 ActiveRecord::Relation

How to do a qwery witch filter ActiveRecord::Relation by linked relation number

我必须在我的 Rails 应用程序中创建表格,这些表格由 ActiveRecord::Relation 链接,就像这样。

# Table name: lease_rents
#  id                  :bigint not null, primary key
class LeaseRent < ApplicationRecord
  has_many :lease_tenant_payments,
  ...
end

class LeaseTenantPayment < ApplicationRecord
  belongs_to :lease_rent
  ...
end

每个 LeaseRent 可以有 0 个或多个 LeaseTenantPayment.

在我的 Rails 控制台中 我试图只获得 LeaseRent 至少有一个或更多 LeaseTenantPayment.

这样做我已经能够获得链接到特定 LeaseRent

LeaseTenantPayment 的数量
LeaseRent.all.where('id = 1').first.lease_tenant_payments.count

我想得到一个 ActiveRecord::Relation 数组,其中包含每个 LeaseRent 至少有 1 个或更多租户付款。像这样:

#<ActiveRecord::Relation [#<LeaseRent id: ...>,<LeaseRent id: ...>,<LeaseRent id: ...>,...]>

有没有人知道如何获得它?

使用连接,它只会 return 行 lease_tenant_payments

LeaseRent.joins(:lease_tenant_payments)

如果你想在循环中使用它们,你可能还需要使用 includes

LeaseRent.joins(:lease_tenant_payments).includes(:lease_tenant_payments)

终于找到我的解决方案了!

有多种方法可以做到。

解决方案 1:

LeaseRent.joins(:lease_tenant_payments).includes(:lease_tenant_payments)

解决方案 2:

LeaseRent.joins(:lease_tenant_payments).distinct

解决方案 3(我最喜欢的原因是它允许通过删除 '.not' 很容易地恢复它):

LeaseRent.includes(:lease_tenant_payments).where.not(lease_tenant_payments: { id: nil })

我正在使用这种方式:

  scope "Aucun Paiement", :all, group: :unpayed do |rents|
    rents.includes(:lease_tenant_payments).where(lease_tenant_payments: { id: nil })
  end

  scope "Reliquat", :all, group: :unpayed do |rents|
    rents.includes(:lease_tenant_payments).where.not(lease_tenant_payments: { id: nil })
  end