如何通过链接的关系号过滤ActiveRecord::Relation



我必须在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

为此,我已经能够获得链接到特定LeaseRentLeaseTenantPayment的数量

LeaseRent.all.where('id = 1').first.lease_tenant_payments.count

我想得到一个ActiveRecord::Relation数组,其中包含每个LeaseRent至少有一个或多个LeaseTenantPayment。像这样的东西:

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

有人知道怎么得到它吗?

使用联接,它只返回具有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

最新更新