2016-05-04 12 views
0

points属性を持つGameモデルがあり、上位20点の合計を計算したいと思います。サブセットまたはレコードのActiveRecord計算

私はポイントを摘み取ることができ、ルビーをしているのように、合計を計算:

Game.order('points desc').limit(20).pluck(:points).sum 

しかし、私は同じことを達成するためにSQL集計計算をAR持って生産する簡単な方法があるかどうかと好奇心。以下の素朴な試みが動作しません:

Game.sum(:points, order: 'points desc', limit: 20) 
SELECT SUM(`games`.`points`) FROM `games` 

おかげ

答えて

0

:(ポイント)ティンので、合計その後、

Game.limit(10).SUMを十分であろう以下答えます。

sumの機能は実際には1つの引数しか取らず、AR 4.xは余分な引数を無視するのに対して、新しいAR 5.0.0ではエラーが発生します。元の試みはまったく素朴でした。

は@pitabas'の提案に続いて、私は、試してみました:あなたはARによって構築SQLから伝えることができるように、これはどちらか動作しません

Game.order('points desc').limit(20).sum(:points) 
SELECT SUM("games"."points") FROM "games" LIMIT ? [["LIMIT", 20]] 

LIMIT句は、クエリの結果に作用するため、これは単一の値です。さらに、ORDER句は完全に無視されます。上記の式の結果は、すべてのレコードのpoints列の合計です。私はそれに着い最も近いが、次のされ

SELECT SUM(points) FROM (SELECT points FROM games ORDER BY points DESC LIMIT 20) 

実際に動作するSQLクエリのようなものである

sq = Game.order('points desc').limit(20) 
Game.from(sq).sum('"points"') 

得られます

SELECT SUM("points") FROM (SELECT "games".* FROM "games" ORDER BY points desc LIMIT ?) subquery [["LIMIT", 20]] 

ハック: pointsの周りの二重引用符に注意してください。それで私はsum引数の文字通りの解釈を強制することができました。それらがなければ、クエリは「そのような列はありません」エラーを発生させます。

+0

私は昨日同じ質問について尋ねましたhttp://stackoverflow.com/questions/43955310/rails-sum-on-associationrelation-attribute-is-incorrect-if-association-has-limit。 'from'の試行さえも、少なくとも関係やPGでは、レール5で動作していません。答えはないと思うが、単に 'relation.pluck(attr).sum'を使う。 – appleII717

2

これを試してみてください:

Game.order('points desc').limit(20).sum(:points) 
+0

はORDERとLIMITの両方として、動作しません、それは私のコンソールに取り組んでいます – Giuseppe

+0

無視され、あなたは後に、それは –

+0

これは私が書いたものと同等であり、それは答えない私自身の答え – Giuseppe

0

制限を()上記の回答に失敗し

Game.order('point desc').limit(2).pluck(:point).inject(:+)

+0

を参照してください実行し得るものエラーを投稿することができます質問は、計算を実行するためにルビーを使用するので。 – Giuseppe

-1

メモしていますあなたがコンピューティングに興味がある場合は、結果を注文することに意味がないこと私は自分の質問に答えるつもりですが、喜んでよりよい解決策を授与されます

+0

慎重に質問をお読みください!答えて... –