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,您可以使用它。
我有以下设置:
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,您可以使用它。