gpt4 book ai didi

sql - 如何在 Rails 中结合内部连接和左外部连接

转载 作者:行者123 更新时间:2023-11-29 12:05:08 25 4
gpt4 key购买 nike

我有两个模型 invoicepayments。它们之间的关系是invoice has_many payments

我正在使用以下左外连接返回所有尚未支付的发票:

result1 = Invoice.includes(:payments).where(:payments => { :id => nil })

我还对所有已部分支付的发票感兴趣。要返回那些我使用内部连接:

result2 = Invoice.joins(:payments).group("transfers.id").having("sum(payments.amount) < invoice.amount")

我现在想合并这两个结果,即我想要所有未支付或未全额支付的发票。我知道我可以做 result = result1 + result2。但是,这不会返回 ActiveRecord 对象。有没有办法将这两个查询合并到一个查询中?

我使用 Rails 4.1 和 PostgreSQL

最佳答案

我相信您是正确的,您不能让 ActiveRecord 在不自己编写的情况下生成除内部连接以外的任何内容。但我不会在这种情况下使用 includes,因为虽然它确实会导致 ActiveRecord 生成不同的连接,但这是一个“实现细节”——它的基本目的是加载 关联的模型,这不一定是您想要的。

在您提出的解决方案中,我不明白您为什么要同时按 invoices.idpayments.id 进行分组——这似乎违背了分组。

您可以执行如下操作,但我不能说这看起来更像 Rails。

Invoice.joins("LEFT JOIN payments ON payments.transfer_id = invoices.id")
.select("invoices.id, SUM(payments.amount) AS total_paid")
.group("invoices.id")
.having("SUM(payments.amount) IS NULL OR SUM(payments.amount) < invoices.amount")

这将返回仅包含 id 字段和 total_paid 字段集的发票对象列表。如果您需要其他可用字段,请将它们添加到 select 语句和 group 语句中。

关于sql - 如何在 Rails 中结合内部连接和左外部连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27029515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com