在单个查询中获取截止日期后的最高天数
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
)
}
在 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
)
}