【问题标题】:Rails 5 ActiveRecord Query - Possible to join 3 tables?Rails 5 ActiveRecord 查询 - 可以加入 3 个表吗?
【发布时间】:2017-06-29 04:04:29
【问题描述】:
鉴于以下模型:
User: id
UserPosition: user_id, job_title_id
JobTitle: id | title
使用 Rails 5,我该怎么做:
current_user.job_title
我需要查找UserPosition 然后JobTitle 以获取title?
这可以通过一个查询来实现吗?
【问题讨论】:
标签:
ruby-on-rails
ruby
postgresql
activerecord
ruby-on-rails-5
【解决方案1】:
你可以通过这样的关联来做到这一点:
class User < ApplicationRecord
has_many :user_positions
has_many :job_titles, through: :user_positions
end
class UserPositions < ApplicationRecord
belongs_to :user
belongs_to :job_title
end
class JobTitle < ApplicationRecord
has_many :user_positions
has_many :users, through: :user_positions
end
这里是 the documentation,用于 Rails 中的多对多关系。
【解决方案2】:
将您的关系定义为:
class User < ApplicationRecord
has_many :user_positions
end
class JobTitle < ApplicationRecord
has_many :user_positions
end
class UserPosition < ApplicationRecord
belongs_to :user
belongs_to :job_title
end
然后您可以使用joins,通过user 模型,使用job_title 和user_position,并且知道user.id,那么您可以使用pluck 来获取所需的属性:
User.joins(user_positions: :job_title).where(id: 1).pluck('job_titles.title')
这会给你一个类似的 SQL 查询:
SELECT job_titles.title
FROM "users"
INNER JOIN "user_positions"
ON "user_positions"."user_id" = "users"."id"
INNER JOIN "job_titles"
ON "job_titles"."id" = "user_positions"."job_title_id"
WHERE (users.id = 1)