在Arel中,我如何将一系列条件与OR结合起来?

时间:2012-02-11 02:32:14

标签: ruby-on-rails ruby arel

我有类似的设置:

  table = self.arel_table
  nodes = [1,2,3].collect do |c|
    table[:foo].eq(c).and( table[:bar].eq(c) )
  end

然后我想要将这些条件片段组合起来以类似于:

的SQL结束
WHERE (foo = 1 AND bar = 1) OR (foo = 2 AND bar = 2) OR (foo = 3 AND bar = 3)

我到目前为止最接近的是:

nodes.inject(nodes.shift) {|memo, node| memo.or( Arel::Nodes::Grouping.new(node) ) }

我以不同的方式尝试过Arel::Nodes::Grouping.new,但它从未按照我想要的方式进行分组。

2 个答案:

答案 0 :(得分:-2)

您可能想要使用squeel,无需重新发明轮子。

有了它,您的案例将类似于:Model.where {foo.like_any nodes}

编辑:

如果您定义自己的sifter将会更容易,它将如下所示(如果您启用本机扩展):

nodes.each do |node|
  where{foo == node & bar == node}
end

答案 1 :(得分:-2)

table = self.arel_table
Person.where([1,2,3].collect { |c| table[:foo].eq(c).and(table[:bar].eq(c)) }.map(&:to_sql).join(" OR "))