1

鉴于使用 Arel 运算符(例如 .eq)生成的 SQL 条件 cond1、cond2 和 cond3,我似乎无法使用 Arel 来生成 SQL:

SELECT * FROM <table> WHERE (cond1 AND cond2) OR cond3

这是因为与条件一起使用.where(),但你不能然后.or() .where() 的结果。您只能在 .where() 中同时使用 .or() 条件。即 .where 和 .or 不在同一个“级别”上,我猜想需要一个与 .or() 级别相同的专用 .and() 方法。

请注意,(cond1 AND cond2) 周围的括号表示这些条件同时被 AND 在一起,其中 OR cond3 是在循环的另一个迭代中添加的。它们对查询结果没有影响。

我已经阅读了 Arel README 并且没有针对这种情况的示例,我无法弄清楚如何使用具有 OR 运算符 | 的 Squeel 动态构建此查询(在循环中)。

4

2 回答 2

0

Arel::Nodes::Grouping 将节点包裹在括号中。

Arel::Nodes::Grouping.new(Arel::Nodes::And.new("blah", "there")).to_sql
# => ('blah' AND 'there')
于 2013-06-18T05:07:34.880 回答
0

使用 Rails 5.2(应该使用 Rails 5+ 或更早版本)

and_conds = Table.arel_table.grouping(
  Table.where(a: 'test', b: 2).arel.constraints.reduce(:and)
)
Table.where(and_conds).or(Table.where(a: 'blah'))

结果类似于...

select * from table where ((a = 'test' and b = 2) or a = 'blah')

于 2018-08-10T01:53:14.077 回答