Nasty profonde boucle imbriquée dans Rails
-
25-09-2019 - |
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
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