如何在ActiveRecord上创建子模型条件


class Invoice < ApplicationRecord
belongs_to :purchase
end
class Purchase < ApplicationRecord
has_many   :invoices
end

Invoice has, boolean "paid"列。

由于它有_many,有时发票记录可能多于1。我想搜索"全部支付",或"部分支付",或"未支付"。购买记录。如发票记录为3条,其中一条已付款,则表示"部分付款">

如何在ApplicationRecord中创建此条件?

我试过了

joins(:invoices).where("invoices.paid": true)

,但它也返回部分付费记录。

我想我自己解决了

paid   = joins(:invoices).where(invoices: {status: true}).pluck(:id)
unpaid = joins(:invoices).where(invoices: {status: false}).pluck(:id)
#return paid
where(id: paid - unpaid)
#return unpaid
where(id: unpaid - paid)
#return partial paid
where(id: paid & unpaid)

由于paid在这里是一个布尔字段,因此它的值要么为真,要么为假。

如果您在Invoice表中有另一个字段(可能是payment_status),应该将记录标识为"完全付费","部分付费","未付费"。那么查询将是:

Purchase.joins(:invoice).where(invoices: {paid: true, payment_status: "Fully Paid"})  # `paid: true` could be omitted
作为一个最佳实践,你可以定义一个作用域:
class Purchase < ApplicationRecord
has_many :invoices
scope    :paid_invoices, -> { joins(:invoice).where(invoices: {payment_status: "Fully Paid"}) }
end

最新更新