鉴于使用Arel运算符(例如.eq)生成的条件cond1,cond2和cond3,我似乎无法使用Arel生成SQL:
SELECT * FROM <table> WHERE (cond1 AND cond2) OR cond3
这是因为AND条件一起使用.where(),但是你不能。或().where()的结果。你只能将.or()条件放在.where()中。即.where和.or不在同一“级别”,我猜想在.or()的同一级别需要一个专用的.and()方法。
请注意,(cond1 AND cond2)周围的括号表示这些条件同时进行AND运算,其中OR cond3在循环的另一次迭代中添加。它们对查询结果没有影响。
我已经读过Arel自述文件并且没有这种情况的例子我无法弄清楚如何使用Squeel动态构建此查询(在循环中),它具有OR运算符|。
答案 0 :(得分:0)
Arel :: Nodes :: Grouping将节点包装在括号中。
Arel::Nodes::Grouping.new(Arel::Nodes::And.new("blah", "there")).to_sql
# => ('blah' AND 'there')
答案 1 :(得分: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')