Rails 如何为 Active Record 编写 SQL EXISTS?

Rails way to write SQL EXISTS for Active Record?

我有以下设置:

class Company
  has_many :users
end

class User
  belongs_to :company
end

我需要获取所有没有特定名称用户的公司,让它成为 'David'。

反之亦然,找到所有拥有名为 David 的用户的公司:

Company.joins(:users).where(users: { name: 'David' }).distinct

但我不知道如何在一个 SQL 请求中完成原始任务。 我试过这个:

Company.joins(:users).where.not(users: { name: 'David' }).distinct

但它并没有像我想的那样起作用。

所以我做了一个原始的 SQL 解决方案,其中查询是:

"SELECT companies 
  FROM companies 
  WHERE NOT EXISTS 
    (SELECT users 
      FROM users 
      WHERE users.company_id = companies.id 
      AND users.name = 'David')"

所以我想知道是否有办法以 rails 方式完成此任务,使用连接和 where 方法,或者可能还有一种 EXISTS 方法。

只需将连接替换为包含

Company.includes(:users).where.not(users: { name: 'David' })

嗯,最后 ActiveRecord 没有 SQL 的全部功能,所以我最终得到了原始的 SQL。

还有一个 gem 将 EXISTS 添加到 ActiveRecord: https://github.com/EugZol/where_exists

如果您想不惜一切代价避免原始 SQL,您可以使用它。