我有两个模型发票
和付款
。它们之间的关系是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.id
和 payment.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
字段集的 Invoice 对象列表。如果您需要其他可用字段,请将它们添加到 select
语句和 group
语句中。
关于sql - 如何在Rails中组合内连接和左外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27029515/