【发布时间】:2015-01-21 17:02:25
【问题描述】:
我有一个这样的 Rails 4 查询:
user.positions.where('positions.active = ? OR positions.deadline < ?', false, Date.current).joins(:cvs).where(cvs: {accepted: true}).group(:id).having('COUNT(cvs.id) = 3')
这会产生以下 SQL 查询:
SELECT `positions`.* FROM `positions` INNER JOIN `cvs` ON `cvs`.`position_id` = `positions`.`id` WHERE `positions`.`user_id` = 4 AND (positions.active = 0 OR positions.deadline < '2015-01-21') AND `cvs`.`accepted` = 1 GROUP BY id HAVING COUNT(cvs.id) = 3
我真正需要的是使第二个 where 查询成为 OR 条件,但上面的查询导致 AND 条件。
我还尝试了以下方法:
user.positions.joins(:cvs).where('positions.active = ? OR positions.deadline < ? OR cvs.accepted = 1 GROUP BY id HAVING COUNT(cvs.id) = ?', false, Date.current, 3)
但这是由 Rails 转换为
SELECT `positions`.* FROM `positions` INNER JOIN `cvs` ON `cvs`.`position_id` = `positions`.`id` WHERE `positions`.`user_id` = 4 AND (positions.active = 0 OR positions.deadline < '2015-01-21' OR cvs.accepted = 1 GROUP BY id HAVING COUNT(cvs.id) = 3)
由于末尾的右括号而引发 sql 语法错误。如果没有左括号和右括号,或者如果将右括号放在“2015-01-21”之后,它会起作用。但我不知道如何告诉 Rails 不要放任何括号。
(我真正想查询的是所有不活跃的职位,或者截止日期已经到的职位,或者一个职位有3个接受的简历)
【问题讨论】:
标签: sql ruby-on-rails ruby-on-rails-4 join