В Ареле, как я могу объединить несколько условий с ИЛИ? - PullRequest
2 голосов
/ 11 февраля 2012

У меня есть установка, подобная этой:

  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 голосов
/ 21 июля 2012
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 "))
0 голосов
/ 11 февраля 2012

Возможно, вы захотите использовать squeel , не нужно заново изобретать колесо.

С ним ваш случай будет выглядеть примерно так: Model.where {foo.like_any nodes}

Редактировать:

Будет намного проще, если вы определите свой собственный фильтр, который будет выглядеть следующим образом (если вы включите собственные расширения):

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