gpt4 book ai didi

sql - 获取有参数但没有其他参数的用户

转载 作者:数据小太阳 更新时间:2023-10-29 07:35:43 26 4
gpt4 key购买 nike

我正在尝试获取具有非管理员特定 ID 的组用户。

目前我有:

group.users
.joins(:roles)
.where(id: user_ids)
.where.not(roles: { role_type: Role::Type::ADMIN })
.pluck(:id)

在我的日志中我有:

加载的SQL:

  (0.3ms)  SELECT "users"."id" FROM "users" INNER JOIN "groups_users" 
ON "users"."id" = "groups_users"."user_id"
WHERE "groups_users"."group_id" = $1 [["group_id", 137375]]

上面查询的SQL:

  (0.6ms)  SELECT "users"."id" FROM "users" INNER JOIN "roles" 
ON "roles"."user_id" = "users"."id" AND "roles"."is_destroyed" = $1
INNER JOIN "groups_users" ON "users"."id" = "groups_users"."user_id"
WHERE "groups_users"."group_id" = $2 AND "users"."id" IN (82884, 82885)
AND "roles"."role_type" != $3 [["is_destroyed", "f"],
["group_id", 137375], ["role_type", 1]]

问题是我总是获得具有匹配 user_ids 的组中的所有用户。 where.not 无效。

我不得不做类似的事情

users_in_group  = group.users.where(id: user_ids).pluck(:id) 

users_in_group -= group.users.joins(:roles).where
(roles: { role_type: Role::Type::ADMIN}).pluck(:id)

我不明白为什么。

最佳答案

如果您想要排除管理员,即使他们有其他角色,您可以使用 SQL EXISTS:

group.users
.where(id: user_ids)
.where("NOT EXISTS (SELECT 1 FROM roles WHERE user_id = users.id AND role_type = ?", Role::Type::ADMIN)
.pluck(:id)

并且,处理对此类建议的典型反对意见:在 Rails 中使用 ActiveRecord 时,完全可以亲自动手编写 SQL 片段。您不应该将自己局限于其 DSL 的(不是那么广泛的)可能性。

UPD

为了简化代码,您可以使用 Where Exists gem(披露:我最近写的)。

gem 'where_exists' 添加到您的 Gemfile 中,运行 bundle install,然后以下操作应该会起作用:

group.users
.where(id: user_ids)
.where_not_exists(:roles, role_type: Role::Type::ADMIN)
.pluck(:id)

关于sql - 获取有参数但没有其他参数的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31806099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com