Question

Je cette boucle imbriquée qui va 4 niveaux de profondeur pour trouver tous les widgets d'image et de calculer leur taille. Cela semble vraiment inefficace et méchant! Je l'ai pensé à mettre le organization_id dans le modèle widget pour que je puisse simplement appeler quelque chose comme organization.widgets. (Named_scope), mais je me sens comme ça est un mauvais raccourci. Y at-il une meilleure façon? Merci

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
Était-ce utile?

La solution

Pour des raisons de performance et de mémoire, vous devriez envisager d'émettre une seule instruction SELECT SUM(total_size), par exemple.

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

Autres conseils

Vous seriez probablement mieux d'utiliser SQL directement pour cela si c'est quelque chose qui se produit avec une certaine fréquence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top