Rails 4 OR 查询与加入 table 使用组并具有

Rails 4 OR query with join table using group and having

我有一个 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个简历的职位)

ActiveRecord 做不到 or 但 Arel 可以。神奇的scuttle.io会解决你的问题:

Position.select(Position.arel_table[Arel.star]).where(
  Position.arel_table[:user_id].eq(4).or(
    Position.arel_table[:active].eq(0).or(Position.arel_table[:deadline].lt('2015-01-21')).or(Cv.arel_table[:accepted].eq(1))
  )
).joins(
  Position.arel_table.join(Cv.arel_table).on(
    Cv.arel_table[:position_id].eq(Position.arel_table[:id])
  ).join_sources
).group(:id)