【问题标题】:how can I create child model conditions on ActiveRecord如何在 ActiveRecord 上创建子模型条件
【发布时间】:2021-11-17 11:32:49
【问题描述】:
class Invoice < ApplicationRecord
  belongs_to :purchase
end

class Purchase < ApplicationRecord
  has_many   :invoices
end


发票有布尔“已付款”列。

由于 has_many,有时发票记录可能超过 1。 我想搜索“全部支付”、“部分支付”或“未支付”的购买记录。 如果发票记录为 3 条,其中一条已支付,表示“部分支付”

我怎样才能用 ApplicationRecord 创造这个条件?

我试过这样

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

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

【问题讨论】:

  • 专业提示:使用日期时间paid_at 列代替一块石头杀死两只鸟。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

我想我自己解决了

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)

【讨论】:

    【解决方案2】:

    由于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
    

    【讨论】:

    • 也许我的解释具有误导性。如果有 3 条记录属于一次购买,则 invoice1 支付真实 invoice2 支付真实 invoice3 支付虚假 在这种情况下,从购买的角度来看,“部分支付” invoice1 支付真实 invoice2 支付真实 invoice3 支付真实这种情况下,“部分支付”所以我想做条件```类购买 {加入(:发票)???? } 范围 :unpaid_invoices, -> { joins(:invoice) ???? } 范围:partial_paid_invoices,-> { joins(:invoice) ???? } 结束
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多