2016-12-25 5 views
0

レールモデルでDBの関係を使用してクエリを最適化アクティブレコードまたはSQLクエリを使用します。私は基本的に上記のコードがループを完了するのにかかる時間とDBのクエリを削減したい。アクティブレコードレール

ありがとうございます。あなたが積極的なロードuser_messagesあるので、それはループ内の他のDBクエリを起動しません、

users = User.where(id: ids).includes(:user_messages) 
users.each do |user| 
    unread_count = user.user_messages.where(:folder => user.inbox_id, :read => false).count 
    puts "UserID #{user.id} ---- Unread Message count #{unread_count}" 
end 

+0

byとcountでグループ化された左結合の仕事のように聞こえます。あなたはsqlの基本的なチュートリアルをやってみましたか? – Shadow

+0

'unread_count'カラムを' users'テーブルに格納して、各ユーザに 'unread_count'を格納する必要があります。 – Thanh

+0

ThanhこのModel.importメソッドを使用してuser_messagesテーブルに大量のデータを挿入するため、ユーザーテーブルに未読カウントを格納できます。 – user1969191

答えて

1

あなたはこのような何かを行うことができます。ユーザーを取得するクエリは1つだけで、user_messagesです。

user_messages = UserMessage.joins(:user).where('folder = users.inbox_id AND read = false').group(:user_id).count 
# user_messages = {1=>10, 2=>19} 
# Here keys are user ids and values are no of user_messages for that user 

user_messages.each do |user_id,unread_msg_count| 
    puts "UserID #{user_id} ---- Unread Message count #{unread_msg_count}" 
end 

PS:あなたが何かを行うことができます

または私は任意のコードをテストしていないが、あなたがいずれかを持っている場合は、任意のエラーをコメントしてください。ここではputs "UserID #{ids}と仮定しています。あなたのコードではすべてのids idsが出力されるため、1つのユーザーIDを入力して自分のコードを変更する必要があります。