2010-06-07 3 views
10

내 Rails 앱에서 배열을 반복하여 OR로 결합해야하는 조건 목록을 만듭니다. 다음은 내가 현재 그렇게하는 기본 흐름입니다.Arel : 여러 조건을 OR로 깨끗하게 결합하는 방법은 무엇입니까?

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

분명히, 그것은 아름답 지 않지만 나는 아직도 Arel 주위에 내 길을 완전히 모른다. 동적으로 생성 된 조건 집합에 OR 결합하는 더 좋은 방법을 제공합니까?

답변

12

: 나는 삼항을 방지하기 위해 기본 오브젝트에 조건을 초기화 할 것 conditions = set.inject { |conds, cond| conds.or(cond) }을하는 수 심지어 작성된 : set.inject(&:or) 아주 좋은 것입니다.

+0

와우 - 나는'주사 '하는 것을 좋아하고, 그것을 과용하고, 어떻게 든이 시나리오를 놓쳤습니다! 감사! :) – Matchu

+1

나는 그것이 ((c1 또는 c2) 또는 c3) 또는 c4)처럼 보이는 조건을 생성한다고 믿습니다. 그들을 (c1 또는 c2 또는 c3 또는 c4)로 정의 할 수 있는지 알고 있습니까? – Roman

+0

https://github.com/rails/arel/blob/master/lib/arel/nodes/or.rb는 Arel의 'or'개념이 바이너리임을 암시하는 것처럼 보입니다. 그래서, "아니오"는 당신의 질문에 대한 답이 될 것입니다. – einarmagnus

0

기본적으로 생각합니다. 이것은 당신이 다른뿐만 아니라 뭔가 내에서 사용할 수있는 한 줄 줄 것이다 inject을위한 완벽한 적합

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

Arel 3.0.3과 activerecord 3.2.16 및 Article을 사용하면 'or'에 응답하지 않습니다. – lulalala

1

유용한 플러그인이 있습니다.

conditions_helper

그것은 복잡한 조건을 생성하는 데 도움이됩니다.