2010-06-07 16 views
10

En mi aplicación Rails, recorro una matriz para crear una lista de condiciones a las que O debe unirse. A continuación se muestra el flujo básico de cómo lo hago actualmente.Arel: cómo unir varias condiciones con OR?

conditions = nil 
set.each do |value| 
    condition = value.to_condition 
    conditions = conditions ? conditions.or(condition) : condition 
end 

Obviamente, no es hermoso, pero todavía no conozco completamente el camino de Arel. ¿Ofrece alguna forma mejor de combinar OR con un conjunto de condiciones generadas dinámicamente?

Respuesta

12

Este es un ajuste perfecto para una inject que le dará una sola línea se puede utilizar dentro de algo más también: conditions = set.inject { |conds, cond| conds.or(cond) } que puede incluso se escribirá: set.inject(&:or) que es muy bueno.

+0

Wow - Me encanta 'inyectar', abusar de él, y de alguna manera lo perdí en este escenario! ¡Gracias! :) – Matchu

+1

Creo que crea una condición que se parece a (((c1 o c2) o c3) o c4). ¿Sabes si es posible definirlos como (c1 o c2 o c3 o c4)? – Roman

+0

https://github.com/rails/arel/blob/master/lib/arel/nodes/or.rb parecería sugerir que la concepción de Arel de 'o' es binaria. Entonces, "no" sería la respuesta a tu pregunta. – einarmagnus

0

Creo que es básicamente eso. Me inicializar condiciones al objeto base para evitar el ternario:

scope = Article 
set.each{|v| scope = scope.or(v.to_condition)} 
+1

Usando Arel 3.0.3 y activerecord 3.2.16 y el artículo no responde a 'o'. – lulalala

1

También hay un complemento útil para esto.

conditions_helper

que ayuda a generar condiciones complejas.

Cuestiones relacionadas