1

我有这个嵌套循环,它深入 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
4

2 回答 2

6

出于性能和内存考虑,您应该考虑发出单个SELECT SUM(total_size)语句,例如

Widget.sum(
  :total_size,
  :conditions => [ 'widget_type = ? AND organization_id = ?',
    Widget::IMAGE', self.id ],
  :joins => [ :pages, :phases, :trips ]
)
于 2010-04-10T04:14:20.957 回答
0

如果它以任何程度的频率发生,那么使用直接 SQL 可能会更好。

于 2010-04-10T04:10:08.483 回答