我有模型User
(用户表)和Job
(作业表)。一个用户可以拥有许多工作(一对多关系)。
用户模型:
has_many :jobs, foreign_key: :user_id
工作模式:
belongs_to :user
用户表有电子邮件列。作业表具有外键user_id
和列job_name
。
用户表中有一行,其id = 1,并且jobs表中有一行,user_id = 1。
我想从两个表行中选择users.email = some email
。
首先我尝试使用:includes
,但是:
用户加载(0.5ms)SELECT
users
。* FROMusers
WHEREusers
。作业加载(0.0ms)SELECT
jobs
。* FROMjobs
WHEREidentities
。user_id
= 1ActiveRecord :: 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 email
与join
?
答案 0 :(得分:0)
如果我正确理解了您的问题,您希望能够获取通过电子邮件过滤的用户并获取与该用户相关的所有作业。如果是这样,以下将起作用,
User.where(email: 'email@email.com').includes(:jobs)
这会根据电子邮件获取用户并急切加载与用户相关的作业。这意味着如果您确实需要列出职位,那么您应该只包括。
如果您使用连接,那么如果有没有工作的用户,他将不会被列出,因为连接在ActiveRecord中被转换为“INNER JOIN”。