没有has_many关系匹配查询的Rails查询

时间:2019-11-25 22:48:14

标签: ruby-on-rails activerecord

我有一个{_1}}个模型,其中有多个Subscription s。

我想查找不存在与某个查询匹配的交易的所有订阅。

这是产生正确结果的手动循环代码。但是,我想使用Transaction查询来做同样的事情。

where

我尝试了很多不同的选项,但是没有一个能产生正确的结果:

# Find all subs that don't have a transaction where foo == bar
subs = []
Subscription.all.each do |sub|
  if sub.transactions.find { |tran| tran.foo == 'bar' } == nil
    subs.push(sub)
  end
end

1 个答案:

答案 0 :(得分:1)

您可以首先选择foo等于bar的所有事务。 然后,您可以选择不在上述结果中的所有订阅ID,这将提供Active Record查询,如下所示:

Subscription.where.not(id: Transaction.where('foo = ?', 'bar').select(:subscription_id).uniq)

这将生成如下的SQL查询:

SELECT * FROM subscriptions WHERE (subscriptions.id NOT IN (SELECT DISTINCT transactions.subscription_id WHERE transactions.foo = 'bar'))