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 に答える