【问题标题】:Select from both tables with where clause with Rails 5使用 Rails 5 从带有 where 子句的两个表中选择
【发布时间】:2017-09-22 15:11:27
【问题描述】:

我有模型User(用户表)和Job(工作表)。一个用户可以有许多工作(一对多关系)。 用户模型:

has_many :jobs, foreign_key: :user_id

工作模式:

belongs_to :user

用户表有电子邮件列。 Jobs 表具有外键 user_id 和列 job_name。 users 表中有一行 id = 1,jobs 表中有一行 user_id = 1。

我想从两个表行中选择users.email = some email

首先我尝试使用:includes,但是:

用户负载 (0.5ms) SELECT users.* FROM users WHERE users.email = 'email@email.com' LIMIT 11

工作负载 (0.0ms) SELECT jobs.* FROM jobs WHERE identities.user_id = 1

ActiveRecord::Relation [#User id: 1, email: "email@email.com", name: "name",created_at: nil, updated_at: nil>]>

之后:joins:

User.joins(:jobs).where(users: {email: 'email@email.com'})

,它返回相同,但只有一个查询

ActiveRecord::Relation [#User id: 1, email: "email@email.com", name: "name",created_at: nil, updated_at: nil>]>

如果我这样做:

user = User.find(1)
user.jobs

我得到了结果。

如何从 users.email = some emailjoin 的两个表中获取结果?

【问题讨论】:

  • 您期望在结果集中出现什么类的实例,JobUser
  • 用户,但如果不能,我只需要两个表中的数据。
  • 因此您想将Jobs' 字段推入User 的实例中。这是破坏您的面向对象建模的某种方式。 user = User.find(1); user.jobs 有什么问题?当您迭代 jobs 时,您仍然有 user 在范围内并且能够使用他的数据。
  • 我正在使用电子邮件,但如果我使用 user = User.where(email: 'some email') 并且在该 user.jobs 之后,它会显示 undefined method jobs
  • 嗯,是的,User.where(email: 'some email') 不是单个用户,而是一组用户(可能包含一个用户,或者没有用户,或者很多用户)。因此,您想获得具有特定电子邮件的用户的所有工作(或一个用户,如果它是唯一的)?

标签: mysql sql ruby-on-rails ruby


【解决方案1】:

如果我正确理解了您的问题,您想要的是能够获取通过电子邮件过滤的用户并获取与该用户相关的所有工作。如果是这样,以下将起作用,

User.where(email: 'email@email.com').includes(:jobs)

这将根据电子邮件为您获取用户并急切加载与用户相关的作业。这意味着您应该仅在您确实需要职位列表时才包括在内。

如果您使用联接,那么如果有一个用户没有工作,他将不会被列出,因为联接在 ActiveRecord 中被转换为“INNER JOIN”。

【讨论】:

  • 它返回我在上面输入的内容(仅来自 users 表的行),但它发出 2 个请求。我不知道为什么。不是加入。
  • 这就是延迟加载的工作原理,它执行两个查询,但是,这发生在同一个连接中。内部联接为您获取用户的数据,但是当您执行 user.jobs 时,另一个请求被发送到数据库。但是,如果您随后调用 user.jobs 使用包含,则服务器不会再调用一次来单独获取作业。
  • 谢谢,但仍然使用:includes 我只获取用户数据。
  • 你是说如果你使用 :includes 获取用户,然后调用 user.jobs 你得到一个空数组?还是零?
  • 如果我将它分配给 var user 并调用 user.jobs,它会显示 - undefined method jobs。我正在使用 Rails 控制台,在那里我看到了结果和查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多