2010-04-10 3 views
1

모든 이미지 위젯을 찾고 크기를 계산할 수 있도록이 네스트 루프가 있습니다. 이것은 실제로 비효율적이고 불쾌한 것 같습니다! 위젯 모델에 organization_id를 두는 것을 생각 했으므로 organization.widgets (named_scope)와 같은 것을 호출 할 수는 있지만, 그렇게 나쁜 느낌이 들었습니다. 더 좋은 방법이 있습니까? 이 주파수의 정도 발생 뭔가 경우 감사Rails에서 심하게 중첩 된 루프

class Organization < ActiveRecord::Base 
... 
    def get_image_widget_total 
    total_size = 0 
    self.trips.each do |t| 
     t.phases.each do |phase| 
     phase.pages.each do |page| 
      page.widgets.each do |widget| 
      if widget.widget_type == Widget::IMAGE 
      total_size += widget.image_file_size 
      end 
     end 
     end 
    end 
    end 
    return total_size 
    end 
... 
end 

답변

6

성능 및 메모리 고려 사항으로 단일 SELECT SUM(total_size) 문을 발행하는 것이 좋습니다.

Widget.sum(
    :total_size, 
    :conditions => [ 'widget_type = ? AND organization_id = ?', 
    Widget::IMAGE', self.id ], 
    :joins => [ :pages, :phases, :trips ] 
) 
+0

감사합니다. 정말 도움이되었습니다. 전에 조인을 사용하는 것에 대해서는 전혀 생각하지 않았습니다. :피 – CalebHC

0

당신은 아마이 직선 SQL을 사용하여 더 나을 것입니다.