Противный глубокий вложенный цикл в Rails - PullRequest
1 голос
/ 10 апреля 2010

У меня есть этот вложенный цикл, который углубляется на 4 уровня, чтобы найти все виджеты изображений и рассчитать их размеры.Это кажется действительно неэффективным и противным!Я подумал о том, чтобы поместить organization_id в модель виджета, чтобы я мог просто вызвать что-то вроде organization.widgets. (Named_scope), но мне кажется, что это плохой путьЕсть ли способ лучше?Спасибо

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

Ответы [ 2 ]

6 голосов
/ 10 апреля 2010

Из соображений производительности и памяти вам следует подумать о выдаче одного оператора SELECT SUM(total_size), например

Widget.sum(
  :total_size,
  :conditions => [ 'widget_type = ? AND organization_id = ?',
    Widget::IMAGE', self.id ],
  :joins => [ :pages, :phases, :trips ]
)
0 голосов
/ 10 апреля 2010

Возможно, вам лучше использовать прямой SQL для этого, если это происходит с любой частотой.

...