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 "))