QUERY:其中has_many关联不包含特定值

时间:2017-04-11 20:04:05

标签: ruby-on-rails postgresql rails-activerecord ruby-on-rails-5

我有两个模型InvoiceInvoiceEvent

Invoice有很多InvoiceEvents

InvoiceEvent有一个字段state

我想写一个查询来查找没有Invoices的所有InvoiceEvent state = 'paid'

我的第一次尝试是

Invoice.joins(:events).where("invoice_events.state != 'paid'")

但这简直抓住了所有发票,因为付费发票仍会有其他事件导致付费事件。

1 个答案:

答案 0 :(得分:3)

首先,您希望的所有InvoiceEvent状态为'paid'

InvoiceEvent.where(:state => 'paid')

从那里你可以获得具有这种状态的事件的Invoice

InvoiceEvent.where(:state => 'paid').select(:invoice_id)

然后,您可以使用子查询查找该列表中不包含的所有Invoice

Invoice.where.not(
  :id => InvoiceEvent.where(:state => 'paid').select(:invoice_id)
)

请注意select(:invoice_id)来电。 ActiveRecord会将其转换为子查询,如:

where id not in (select invoice_id from ...)

这样数据库就可以完成这项工作而无需在Rails-land中提取大量数据,只是将其发送回数据库。