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