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)
我有一个 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)