【发布时间】:2019-08-27 18:22:46
【问题描述】:
我有一个 Bug 课程,里面有用户表中的分析师和提交者。
class Bug < ApplicationRecord
belongs_to :analyst, class_name: 'User'
belongs_to :committer, class_name: 'User'
...
end
我有一个搜索,其中可能包括搜索分析师、提交者或两者兼而有之。
我如何知道我的表将使用哪个表别名活动记录?
如果我像这样搜索分析师,我得到的 SQL,
analyst = 'abenge'
Bug.joins(:analyst).where(users: {username: analyst}).to_sql
=> "SELECT `bugs`.* FROM `bugs`
INNER JOIN `users` ON `users`.`id` = `bugs`.`analyst_id`
WHERE `users`.`username` = 'abenge'"
同样,如果我搜索提交者,我得到的 SQL,
analyst = 'amcdonnell'
Bug.joins(:committer).where(users: {username: committer}).to_sql
=> "SELECT `bugs`.* FROM `bugs`
INNER JOIN `users` ON `users`.`id` = `bugs`.`committer_id`
WHERE `users`.`username` = 'amcdonnell'"
但如果我同时搜索两者,则 where 调用不能同时使用 users。表有别名,我需要使用别名。
Bug.joins(:analyst, :committer)
.where(users: {username: committer})
.where(committers_bugs: {username: committer}).to_sql
=> "SELECT `bugs`.* FROM `bugs`
INNER JOIN `users` ON `users`.`id` = `bugs`.`analyst_id`
INNER JOIN `users` `committers_bugs` ON `committers_bugs`.`id` = `bugs`.`committer_id`
WHERE `users`.`username` = 'abenge'
AND `committers_bugs`.`cvs_username` = 'amcdonnell'"
所以我的问题是,“我如何知道在 where 子句中为提交者的用户名使用哪个键,在一种情况下是 users 而在另一种情况下是 committers_bugs?
我希望代码是这样的:
relation = Bug
analyst = params['analyst']
if analyst.present?
relation = relation.joins(:analyst).where(user: {username: analyst})
end
committer = params['committer']
if committer.present?
relation = relation.joins(:committer).where(committers_bugs: {username: committer})
end
问题是,如果他们同时搜索以上内容,则上述方法有效。但是,如果他们搜索提交者而不搜索分析师,则活动记录使用users 作为表名来连接committer。
【问题讨论】:
-
我从建议的答案中获得了一些见解,这让我意识到添加 SQL 会使我的问题更清楚,所以我编辑了我的问题。
标签: ruby-on-rails join activerecord