【问题标题】:Omit chaining parenthesis when using multiple Arel OR clauses使用多个 Arel OR 子句时省略链括号
【发布时间】:2017-10-23 14:36:37
【问题描述】:

我正在尝试抽象出有人在我们的代码库中插入的原始 sql 主体,我们使用的是 Rails 4.2.8。我想要生成以这样的 where 子句结尾的 sql:

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

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

my_clause = mytable[:col1].eq(1)
    .or(mytable[:col2].eq(1))
    .or(mytable[:col3].eq(1))
puts my_clause.to_sql

我实际上得到的是:

WHERE (col1=1 OR col2=1) OR col3=1

我意识到我的代码不会生成单词“WHERE”。为了清楚起见,我添加了它。

我们的 dba 能够向我保证,这在性能方面并不是什么大问题,但它会触发我的强迫症,我想知道我将使用什么 Arel 语法来获取不带括号的链式 OR 子句。

【问题讨论】:

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


    【解决方案1】:

    您可以尝试直接使用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) 
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-23
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      相关资源
      最近更新 更多