2016-08-09 7 views
-2

このコードをどのように最適化することが可能ですか? (最適化Ruby on Rails(数)

(多くのメッセージ)

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

おかげで、あなたに

+3

使用[ 'counter_cache'](HTTP: //yerb.net/blog/2014/03/13/three-easy-steps-to-using-counter-caches-in-rails/)。 –

+7

質問はあいまいです。最も単純な答えは 'Message.all.count'です。 –

+0

はい@GregDanが正しいです –

答えて

-1

はこれを試してみてください。

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

をお使いの場合は、最終的にはあなたがすべてのメッセージを数えている。あなたは

を使用することができますので
Message.count 
+3

どのように最適化されました(注入)? –

+0

また、あなたの前提(「あなたはすべてのメッセージを数えています」)は何も基づいていません。 –

+0

このインジェクションの場合、イテレータ内でハード計算を行わずに配列に対して1回の反復しか行いません。 –

0

has_many :messagesMessageモーダルに関連付けられたモーダルUserがあると仮定しています。あなたは、単一の行のクエリで使用することができます users = User.created_after(3.days.ago)か何か

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

または

Message.where(user: users).count 
あなたはまた、としてそれを書くことができ
+0

あなたは 'users'がすべてのユーザーを表すと仮定します。それは必ずしも真実ではない。私たちが知っている限り、それは 'users = User.created_after(3.days.ago)'または何か –

+0

とすることができます。もちろん、ユーザーはあなたがデータベースから望むユーザーを含み、クエリは解雇されることができます。... –

+0

この場合、 'Message.all.count'は間違った解決策です。 'Message.count'、btwだけでもかまいません。 –

0

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