在单个查询中获取截止日期后的最高天数

Get the highest days after due date in single query

在 Rails 6 应用程序中,我有一张发票 table。客户有很多发票,发票属于客户,在发票 table 中,我有字段 due_date.

我需要获取发票 due_date 之后的最高天数。

为了从客户那里获取发票详细信息,我使用以下范围

scope :days_past_due_date, -> { where('invoice_status NOT IN (?) and due_amount > ? and due_date < ?',
[Invoice.invoice_statuses['voided'], Invoice.invoice_statuses['deleted'], Invoice.invoice_statuses["paid"]],
0.0, Date.today)}

所以我的代码是 customer.invoices.days_past_due_date 这将在过滤 due_date 和 invoice_status 过滤器的数组中获取客户的发票。

有多个发票,我需要通过天数计算找到 due_date 天数最多的发票天数。

所以如果 due_date 是 10 月 28 日,而今天是 10 月 31 日,那么 3 天过去了 due_date。

我需要获得通过 due_date 发票的最大天数。

使用sqlGROUP BY,rails.group().

Invoice.group(:customer_id).pluck(:customer_id, Invoice.arel_table[:due_date].minimum)

这将为您提供每个 customer_id 的最早截止日期。使用 ruby 应该足以完成其余的工作,或者您可以在数据库中使用稍微复杂的查询来完成。

Invoice.group(:customer_id).pluck(:customer_id, (Arel::Nodes.build_quoted(Date.today) - Invoice.arel_table[:due_date]).maximum)

这将获得每个 customer_id 的最大逾期天数。如果您只想考虑与您的范围匹配的发票,只需在此处添加该范围。

Invoice.days_past_due_date.group(:customer_id).pluck(:customer_id, (Arel::Nodes.build_quoted(Date.today) - Invoice.arel_table[:due_date]).maximum)

试试这个 (Postgres)

这将在结​​果中添加一个 overdue_by Integer 列(天)
您可以像 User.first.invoices.days_past_due_date.first.overdue_by

一样访问
scope :days_past_due_date, -> { 
  select(Arel.sql %(invoices.*, CURRENT_DATE - due_date::DATE overdue_by))
  .where('invoice_status NOT IN (?) and due_amount > ? and due_date < ?',
    [Invoice.invoice_statuses['voided'], Invoice.invoice_statuses['deleted'], Invoice.invoice_statuses["paid"]], 0.0, Date.today
  )
}