2016-08-09 68 views
-2

Wie ist es möglich, diesen Code zu optimieren? (Optimierung Ruby on Rails (Anzahl)

(Viele Nachrichten)

def messages_count 
     total = 0 
     users.each do |u| 
     total += u.messages.size 
     end 
    total 
    end 

Dank Sie

+3

Verwenden [ 'counter_cache'] (http: //yerb.net/blog/2014/03/13/three-easy-step-to-using-counter-caches-in-rails/). –

+7

Die Frage ist mehrdeutig. Die einfachste Antwort ist 'Message.all.count' –

+0

ja @GregDan ist richtig –

Antwort

-1

bereits.

def messages_count 
    total = users.inject(0) {|result,user| result + user.messages.size} 
end 

In Ihrem Fall schließlich werden Sie alle Nachrichten zu zählen. So Sie nutzen könnten

Message.count 
+3

Wie ist es mehr optimiert (die injizieren)? –

+0

Auch Ihre Annahme ("Sie zählen alle Nachrichten") basiert auf nichts. –

+0

In diesem Fall von inject, machen wir nur eine Iteration über ein Array ohne jede harte Berechnung innerhalb des Iterators. –

0

Wie ich gehe davon aus, dass es ein modales User verbunden mit has_many :messagesMessage modal gibt. users = User.created_after(3.days.ago) oder etwas Sie in einer einzigen Zeile Abfrage

Message.where("user_id IN (?)",users.pluck(:id)).count 

oder

Message.where(user: users).count 
+0

Sie gehen davon aus, dass 'Benutzer' alle Benutzer repräsentieren. Was nicht unbedingt wahr ist. Nach allem, was wir wissen, kann es 'users = User.created_after (3.days.ago)' oder etwas sein –

+0

ja natürlich Benutzer enthalten Benutzer, die Sie wollen von db und Abfrage kann gefeuert werden, keine Sorgen darüber ... –

+0

In In diesem Fall ist "Message.all.count" eine falsche Lösung. Kann nur 'Message.count' sein, übrigens. –

0

Sie können auch schreiben Sie es als verwenden können:

def messages_count 
    users.sum { |u| u.messages.size } 
end