使用多个Arel OR子句时省略链接括号

时间:2017-10-23 14:36:38

标签: sql ruby-on-rails ruby-on-rails-4 activerecord arel

我试图在我们的代码库中抽出一个原始sql的主体,我们正在使用Rails 4.2.8。我想要生成以where子句结尾的sql:

SELECT product.product_id FROM `oc_product` product
LEFT JOIN `oc_product_attribute` attribute ON product.product_id = attribute.product_id
WHERE 
((attribute.attribute_id = 13 (weight) AND `text` BETWEEN 1 AND 2) 
OR (attribute.attribute_id = 12 (length) AND `text` BETWEEN 10 AND 12));

我正在使用以下Arel来尝试生成该sql:

AND

我实际得到的是:

WHERE col1=1 OR col2=1 OR col3=1

我意识到我的代码没有生成'WHERE'这个词。为了清楚起见,我补充说。

我们的dba已经能够向我保证它在性能方面不是什么大问题,但是它触发了我的OCD,我想知道我将使用什么Arel语法来获得链接OR条款而不是parens。

1 个答案:

答案 0 :(得分:3)

您可以尝试直接使用Arel::Nodes::Or构建所需的查询(而不是使用括号的or方法):

[
  mytable[:col1].eq(1), 
  mytable[:col2].eq(1), 
  mytable[:col3].eq(1)
].reduce {|clause, condition| 
  Arel::Nodes::Or.new(clause, condition) 
}