このコードをどのように最適化することが可能ですか? (最適化Ruby on Rails(数)
(多くのメッセージ)
def messages_count
total = 0
users.each do |u|
total += u.messages.size
end
total
end
おかげで、あなたに
このコードをどのように最適化することが可能ですか? (最適化Ruby on Rails(数)
(多くのメッセージ)
def messages_count
total = 0
users.each do |u|
total += u.messages.size
end
total
end
おかげで、あなたに
はこれを試してみてください。
def messages_count
total = users.inject(0) {|result,user| result + user.messages.size}
end
をお使いの場合は、最終的にはあなたがすべてのメッセージを数えている。あなたは
を使用することができますのでMessage.count
どのように最適化されました(注入)? –
また、あなたの前提(「あなたはすべてのメッセージを数えています」)は何も基づいていません。 –
このインジェクションの場合、イテレータ内でハード計算を行わずに配列に対して1回の反復しか行いません。 –
私has_many :messages
Message
モーダルに関連付けられたモーダルUser
があると仮定しています。あなたは、単一の行のクエリで使用することができます users = User.created_after(3.days.ago)
か何か
Message.where("user_id IN (?)",users.pluck(:id)).count
または
Message.where(user: users).count
あなたはまた、としてそれを書くことができ
あなたは 'users'がすべてのユーザーを表すと仮定します。それは必ずしも真実ではない。私たちが知っている限り、それは 'users = User.created_after(3.days.ago)'または何か –
とすることができます。もちろん、ユーザーはあなたがデータベースから望むユーザーを含み、クエリは解雇されることができます。... –
この場合、 'Message.all.count'は間違った解決策です。 'Message.count'、btwだけでもかまいません。 –
:
def messages_count
users.sum { |u| u.messages.size }
end
使用[ 'counter_cache'](HTTP: //yerb.net/blog/2014/03/13/three-easy-steps-to-using-counter-caches-in-rails/)。 –
質問はあいまいです。最も単純な答えは 'Message.all.count'です。 –
はい@GregDanが正しいです –