Rails 5.1 has_many 通过 - 关联字段
Rails 5.1 has_many through - associated fields
(参见下面的示例架构图像)
我正在尝试使用 email
字段以及 id
和 key
字段从 users
table 查询单个用户applications
table。结果应包含找到的用户(如果有)、应用程序(使用 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 在我尝试访问 user.applications
时执行第二个 SQL 查询(并且它还 returns 所有与用户;所以它似乎忽略了 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!
这会正确获取用户和正确的应用程序(耶!),但是如果我尝试调用 user.applications_users
,Rails 会执行第二个 SQL 查询——它还会 returns applications_users
table 中所有数据的集合(同样,忽略 id
& key
条件)
user = User.where(email: args[:username]).joins(:applications).where(
jwt_applications: {
id: args[:application][:id],
key: args[:application][:key]
}
).take!
这得到了正确的用户,但是当我尝试访问 user.applications
时 Rails 执行另一个 SQL 查询——同时返回所有应用程序。
无论如何,希望 Rails 天才能够解答这个问题!我将是第一个承认我绝不是 Rails 专家的人;在我职业生涯的最后 10 年里,我一直在 PHP 和 C++ 中编码,所以如果这是一个愚蠢的问题,请多多包涵 :)
不确定这是否是您要找的东西,但是...
您可以像这样编写 ActiveRecord 查询(连接模型应该隐式添加到您的查询中):
User.joins(:applications).where(email: email).where(applications: { key: key, id: id})
将电子邮件、密钥和 ID 作为传递给查询的参数。
在该查询之上,您可以使用 select 字段来获取所需的一切:
user = User.joins(:applications).where(email: email).where(applications: { key: key, id: id}).select('users.*, applications.id as appid applications.key as appkey').first
这将返回用户模型(如果存在)或空关系(如果没有符合您的条件)。
然后,您可以将这些字段称为
user.appid
user.appkey
你总是可以调用 select ('users.*, application_users.scopes, applications.*)
这将 return 你在单个实例中的所有字段(仍在用户模型下)但是像 id 这样的重复字段只会显示一次,这就是为什么最好只抓取您想要的字段并为它们提供唯一标识符,就像我用 appid 和 appkey 显示的那样。
同样,这可能不是您想要的,但希望它能为您指明正确的方向!
(参见下面的示例架构图像)
我正在尝试使用 email
字段以及 id
和 key
字段从 users
table 查询单个用户applications
table。结果应包含找到的用户(如果有)、应用程序(使用 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 在我尝试访问 user.applications
时执行第二个 SQL 查询(并且它还 returns 所有与用户;所以它似乎忽略了 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!
这会正确获取用户和正确的应用程序(耶!),但是如果我尝试调用 user.applications_users
,Rails 会执行第二个 SQL 查询——它还会 returns applications_users
table 中所有数据的集合(同样,忽略 id
& key
条件)
user = User.where(email: args[:username]).joins(:applications).where(
jwt_applications: {
id: args[:application][:id],
key: args[:application][:key]
}
).take!
这得到了正确的用户,但是当我尝试访问 user.applications
时 Rails 执行另一个 SQL 查询——同时返回所有应用程序。
无论如何,希望 Rails 天才能够解答这个问题!我将是第一个承认我绝不是 Rails 专家的人;在我职业生涯的最后 10 年里,我一直在 PHP 和 C++ 中编码,所以如果这是一个愚蠢的问题,请多多包涵 :)
不确定这是否是您要找的东西,但是... 您可以像这样编写 ActiveRecord 查询(连接模型应该隐式添加到您的查询中):
User.joins(:applications).where(email: email).where(applications: { key: key, id: id})
将电子邮件、密钥和 ID 作为传递给查询的参数。
在该查询之上,您可以使用 select 字段来获取所需的一切:
user = User.joins(:applications).where(email: email).where(applications: { key: key, id: id}).select('users.*, applications.id as appid applications.key as appkey').first
这将返回用户模型(如果存在)或空关系(如果没有符合您的条件)。 然后,您可以将这些字段称为
user.appid
user.appkey
你总是可以调用 select ('users.*, application_users.scopes, applications.*)
这将 return 你在单个实例中的所有字段(仍在用户模型下)但是像 id 这样的重复字段只会显示一次,这就是为什么最好只抓取您想要的字段并为它们提供唯一标识符,就像我用 appid 和 appkey 显示的那样。
同样,这可能不是您想要的,但希望它能为您指明正确的方向!