2010-06-07 6 views
10

Nella mia app Rails, eseguo il loop di un array per creare un elenco di condizioni che devono essere unite da OR. Di seguito è riportato il flusso di base di come attualmente lo faccio.Arel: Come aderire in modo pulito a più condizioni con OR?

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

Ovviamente, non è bello, ma io non conosco ancora completamente il mio modo di aggirare Arel. Offre un modo migliore di OR-partecipare a un insieme di condizioni generate dinamicamente?

risposta

12

Questa è una misura perfetta per un inject che vi darà una battuta è possibile utilizzare all'interno anche qualcos'altro: conditions = set.inject { |conds, cond| conds.or(cond) } che può anche essere scritto: set.inject(&:or) che è molto bello.

+0

Wow - Adoro 'iniettare ', esagerare, e in qualche modo mi è mancato per questo scenario! Grazie! :) – Matchu

+1

Credo che crei una condizione simile a (((c1 o c2) o c3) o c4). Sai se è possibile definirli come (c1 o c2 o c3 o c4)? – Roman

+0

https://github.com/rails/arel/blob/master/lib/arel/nodes/or.rb sembrerebbe suggerire che la concezione di Arel di 'or' è binaria. Quindi, "no" sarebbe la risposta alla tua domanda. – einarmagnus

0

Penso che sia fondamentalmente. Mi piacerebbe inizializzo condizioni per l'oggetto di base per evitare il ternario:

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

Utilizzo di Arel 3.0.3 e activerecord 3.2.16 e l'articolo non risponde a "o". – lulalala

1

C'è anche un plugin utile per questo.

conditions_helper

aiuta a generare condizioni complesse.

Problemi correlati