我必须在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至少有一个或多个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