2016-05-02 14 views
1

Userモデルです。has_onePicturecarrierwaveバックエンド)とhas_manyjournalsです。1つのActiveRecordクエリにグループ化、合計、インクルードする方法は?

最大スコア(scoreフィールドの合計はJournalモデル)の上位Nユーザーを取得する必要があります。

私はそれは私がUser.top.picturePictureを取得しようとしたとき、私は、データベースへの追加の要求を取得し、動作しますが、

scope :top, lambda { |n=10| 
    joins(:picture, :journals) 
    .select("users.*, pictures.image, sum(journals.score) as total_score") 
    .order("total_score desc ") 
    .group("users.id", "pictures.image") 
    .limit(n) 
} 

このスコープを書きました。

スコープのI include(:picture)フィールドの場合、total_scoreフィールドが暴走します。

このクエリはどのように修正できますか?あなたがこのトピックについてアドバイスできるなら、私は非常に満足しています。

+0

具体的にお答えください。どこでデータベースを追加呼び出ししていますか? –

+0

私は質問を更新しました。ピクチャモデルをキャッシュできないので、 'User.top.picture'を実行すると追加のクエリが出ます。 –

答えて

1

私は外側の合計スコアのためにサブクエリにusersに参加することによってこれを行うだろう:

scope :top, lambda { |n=10| 
    select("users.*, total_score"). 
    joins("left join (select user_id, sum(score) total_score from journals " + 
     "group by user_id) total_scores on users.id = total_scores.user_id"). 
    order("total_score desc"). 
    limit(n). 
    includes(:picture) 
} 

をこれは、いくつかのマニュアルSQLを使用していますので、より多くのデータベース固有であるが、それは、ユーザーごとに1つのローを返しので、それがするのは簡単です理解し、拡張する。

+0

ありがとうございます。それは動作します、私は少し構文を修正して、それはthatsです。 –

関連する問題