ruby-on-rails - Rails 5.1 has_many through - 关联字段

标签 ruby-on-rails postgresql rails-activerecord has-many-through ruby-on-rails-5.1

(请参阅下面的示例架构图像)

我正在尝试使用 email 字段以及 idkey 从 users 表中查询单个用户 applications 表中的字段。结果应包含找到的用户(如果有)以及应用程序(使用 keyid 字段引用)和相关的 applications_users数据。

Example schema

我可以轻松地手动编写 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!

这会正确获取用户,但是当我尝试访问 user.applications 时,Rails 会执行第二个 SQL 查询(并且它还会返回与用户关联的所有应用程序;因此它似乎忽略了 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 查询——它还会返回所有数据的集合在 applications_users 表中(再次忽略 idkey 条件)

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})

将电子邮件、 key 和 ID 作为参数传递给查询。

在该查询之上,您可以使用选择字段来获取所需的一切:

user = User.joins(:applications).where(email: email).where(applications: { key: key, id: id}).select('users.*, applications.id as appid applications.key 作为 appkey').first

这将返回用户模型(如果存在)或空关系(如果没有符合您的条件)。 然后你可以像这样调用字段

user.appid

user.appkey

您始终可以调用 select ('users.*, application_users.scopes, applications.*) 这将返回单个实例中的所有字段(仍在 User 模型下)但重复字段如 id只会显示一次,这就是为什么最好只抓取您想要的字段并为它们提供唯一标识符,就像我用 appid 和 appkey 显示的那样。

同样,这可能不是您所追求的,但希望它能为您指明正确的方向!

关于ruby-on-rails - Rails 5.1 has_many through - 关联字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44723442/

相关文章:

mysql - 存储彩票信息的数据库设计

ruby-on-rails - 不确定如何实现 GEM 'Thumbs_up' [rails 4]

ruby-on-rails - RSpec 不加载我的类,即使它在 Rails 控制台中加载

ruby-on-rails - 无法将本地主机连接到 heroku 数据库

sql - 在复合类型数组中搜索元素

SQL - 使用 Postgres 中的附加查询扩展 INSERT 查询的结果

ruby-on-rails - Postgresql jsonb (Rails) - 通过数组在单个 json 属性中查询多个值

css - 为什么 Bundle Update 改变了 CSS?

ruby-on-rails - ActiveRecord belongs_to 关联中的 PostgreSQL jsonb 字段

ruby-on-rails - 从 api 保存数据(但只保存一次)