无法使用Arel以编程方式组合AND和OR条件

时间:2013-05-14 10:47:47

标签: ruby-on-rails-3.2 rails-activerecord arel

鉴于使用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运算符|。

2 个答案:

答案 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')