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

Ruby on rails 在Arel中,如何将一系列条件与OR结合起来?,ruby-on-rails,ruby,arel,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

我的设置与此类似:

  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以不同的方式进行分组,但它从不按照我的意愿进行分组。

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

有了它,您的案例看起来像:
Model.where{foo.like\u any nodes}

编辑: 如果您定义自己的筛选器,这将更加容易,如下所示(如果您启用本机扩展):

你可能想使用,不需要重新发明轮子

有了它,您的案例看起来像:
Model.where{foo.like\u any nodes}

编辑: 如果您定义自己的筛选器,这将更加容易,如下所示(如果您启用本机扩展):

不应该在下面使用to_sql的可能副本。请参阅:下面不应该使用to_sql。见:
nodes.each do |node|
  where{foo == node & bar == node}
end
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 "))