(请参见下面的示例架构图像)
我正在尝试users
使用该email
字段以及表中的id
&key
字段从applications
表中查询单个用户。结果应包含找到的用户(如果有),以及应用程序(使用key
&id
字段引用)和applications_users
相关数据。
我可以很容易地手动编写 SQL 来执行这个操作:
SELECT
"users".*,
"applications_users"."scopes",
"jwt_applications".*
FROM
"users"
INNER JOIN
"applications_users" ON "applications_users"."user_id" = "users"."id"
INNER JOIN
"jwt_applications" ON "jwt_applications"."id" = "applications_users"."application_id"
WHERE
"users"."email" = 'rainbows@unicorns.net'
AND "jwt_applications"."id" = '01daafc9-2169-4c78-83e9-37ac0a473e3d'
AND "jwt_applications"."key" = 'follow_the_rainbow'
LIMIT 1
但是,在使用 ActiveRecord 时,我终生无法正确查询。
这些是我迄今为止所做的不成功的尝试:
user = User.where(email: args[:username]).joins(:applications).merge(
JwtApplication.where(id: args[:application][:id], key: args[:application][:key])
).take!
这可以正确获取用户,但是当我尝试访问时 Rails 会执行第二个 SQL 查询user.applications
(它还返回与用户关联的所有应用程序;因此它似乎忽略了id
&key
条件)
user = User.where(email: args[:username]).joins(:applications).merge(
JwtApplication.where(id: args[:application][:id], key: args[:application][:key])
).references(:applications_users).take!
这可以正确获取用户以及正确的应用程序(耶!),但是如果我尝试调用 Rails 会执行第二个 SQL 查询user.applications_users
——它还会返回表内所有数据的集合applications_users
(同样,忽略id
&key
条件)
user = User.where(email: args[:username]).joins(:applications).where(
jwt_applications: {
id: args[:application][:id],
key: args[:application][:key]
}
).take!
这获得了正确的用户,但是当我尝试访问时 Rails 执行另一个 SQL 查询user.applications
——同时返回所有应用程序。
无论如何,希望 Rails 天才可以对这个问题有所了解!我将是第一个承认我绝不是 Rails 专家的人。在我职业生涯的最后 10 年中,我一直在 PHP 和 C++ 编码,所以如果这是一个愚蠢的问题,请多多包涵 :)