我有类似的设置:
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
,但它从未按照我想要的方式进行分组。
答案 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 "))