2012-06-07 5 views
1

아시다시피, 그것은 끔찍한 것처럼 보입니다. 그러나 이제는 사용자 수가 너무 커서 시스템이 정확히 어디에서 "잊어 버리기"시작했습니다 (데이터베이스 연결이 끊어졌습니다) 이 중첩 루프를 다시 작성하는 가장 좋은 방법은 무엇입니까?중첩 루프 다시 쓰기

User.all.each_with_index do 
get Subset of criteria to select data 
Subset1.each do 
    getSubset2 
    Subset2.each do 
    getSubset3 
    Subset3.each do 
     getSubset4 
     Subset4.each do 
     compute something 
     open file A 
      create or update a line 
     end 
     end 
     end 
    end 
    end 
end 

편집 : 서브 세트는 쿼리 또는 미리 정의 된 배열입니다. 나는

User.all.each_with_index do |user| 
Subset1.each do |parameter1| 
    Subset2(function(user,parameter1)).each do |object2| 
    Subset3.each do |parameter3| 
     getSubset4(user, parameter1, object2, parameter3) 
     Subset4.each do |data| 
      p data 
     end 
    end 
    end 
end 
end 
+2

이것은 다소 모호합니다. 'getSubset'는 무엇을합니까? 다른 데이터베이스 쿼리입니까? – Stefan

+0

그 코드를 우리가 할 수있는 코드로 리팩토링해야 할 것입니다 (잘하면 실행 가능한 루비). 스테판은 말하기를 너무 모호합니다. – tokland

답변

1

돼지는의 밖으로 그 중첩 된 쿼리를 중단, 사용자가 모든 사용자를 통해

#name, gender, city, profession 
Alice, female, Los Angeles, doctor 
Bob, male, Los Angeles, lawyer 
Carol, female, New York, astronaut 
David, male, New York, programmer 

보다는 루프, 도시의 모든 사용자, 성별의 모든 사용자입니다 가정 해 봅시다 .

#bad 
User.each do |u1| 
    u1.cities.each do |u2| 
    u2.genders.each do |u3| 
     u3.professions.each do |u4| 
     u4.some_method 
     end 
    end 
    end 
end 

#better 
cities = ["Los Angeles", "New York"] 
genders = ["female", "male"] 
professions = ["lawyer", "doctor", "astronaut", "programmer"] 
criteria = cities.product(genders, professions) 

이제 모든 배열의 교차 생성물을 수집하는 하나의 배열 (조건)을 반복 할 수 있습니다.

criteria.each do |cr| 
    city, gender, profession = cr 
    u = User.find_by_city_and_gender_and_profession(city, gender, profession) 
    u.some_method 
end 
+0

내 경우에는 모든 사용자가 도시, 성별 및 직업을 가진 친구를 갖는 것과 같습니다. 모든 사용자에게 직업에 의존하는 기준을 충족하는 친구와 함께 모든 직업의 친구들을 찾아야합니다 (예 : 같은 성별의 의사 친구가있는 동안 주변 도시의 친구를 찾아야하는 변호사의 경우). 몇 연령대. – Tyra

+0

그럼에도 불구하고 일련의 매개 변수를 루프하여 일련의 사용자를 반복하고 연속 매개 변수를 적용하는 것이 아니라 기준을 작성하는 것이 좋습니다. '.product' 메서드를 제안하는 유일한 이유는 배열 곱셈을 사용하여 조건을 쉽게 작성하기 때문입니다. 그러나 특정 조건을 체리 선택해야하는 경우에는 그렇게 할 수 있습니다. 'criteria = [{: profession => '변호사', : 도시 => '로스 앤젤레스'}, {: 전문직 => "의사", 성별 => "남성"}]' – Ron

1
subset1 = %w(a b c) 
subset2 = %w(d e f g) 
subset3 = [1,2,3,4,5] 

subset1.product(subset2, subset3) do |data| 
    p data 
end 

이 트리플 루프하는 것과 같은 효과가 있습니다를 BRB 것, 제안을 결합하는 것을 시도하고있다. @ steenslag의 대답 떨어져 백업