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
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
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
Wie ist es mehr optimiert (die injizieren)? –
Auch Ihre Annahme ("Sie zählen alle Nachrichten") basiert auf nichts. –
In diesem Fall von inject, machen wir nur eine Iteration über ein Array ohne jede harte Berechnung innerhalb des Iterators. –
Wie ich gehe davon aus, dass es ein modales User
verbunden mit has_many :messages
Message
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
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 –
ja natürlich Benutzer enthalten Benutzer, die Sie wollen von db und Abfrage kann gefeuert werden, keine Sorgen darüber ... –
In In diesem Fall ist "Message.all.count" eine falsche Lösung. Kann nur 'Message.count' sein, übrigens. –
Sie können auch schreiben Sie es als verwenden können:
def messages_count
users.sum { |u| u.messages.size }
end
Verwenden [ 'counter_cache'] (http: //yerb.net/blog/2014/03/13/three-easy-step-to-using-counter-caches-in-rails/). –
Die Frage ist mehrdeutig. Die einfachste Antwort ist 'Message.all.count' –
ja @GregDan ist richtig –