我有一个{_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
答案 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'))