0

私は、要求があります。ActiveRecordのAVG計算

Model.group(:p_id).pluck("AVG(desired)") 
=> [0.77666666666666667e1, 0.431666666666666667e2, ...] 

を私はSQL

SELECT AVG(desired) AS desired 
FROM model 
GROUP BY p_id 

を実行したとき、私はその理由は何

----------------- 
|  desired | 
|-----------------| 
| 7.76666666666667| 
|43.1666666666667 | 
|  ...  | 
----------------- 

を得ましたか。確かに私は繁殖することができますが、どこに説明があるべきかを賭けています。

Model.group(:p_id).pluck("p_id, AVG(desired)") 

この場合には、正しいAVG値を取得する方法:私の要求があるので

私は

Model.group(:p_id).pluck("AVG(desired)").map{|a| a.to_f} 
=> [7.76666666666667,43.1666666666667, ...] 

は今、私は他のタスクとの闘いだことがわかった、私は摘むの数値属性を必要とします?

答えて

2

0.77666666666666667e1は、彼らがわずかに異なる精度を持つ2つの異なる表現で同じ番号だ、(ほぼ)7.76666666666667です。あなたはirbに最初のものをダンプする場合は、表示されます:

> 0.77666666666666667e1 
=> 7.766666666666667 

を使用すると、データベースにavgを実行すると、結果はActiveRecordのは、RubyのBigDecimalを使って表しnumericを入力しています。 BigDecimalの値は科学的表記法で表示されていますが、表示するデータを書式設定するときには違いはありません。いずれの場合においても

は、pluckがこの仕事のための適切なツールではありません、あなたはaverageを使用したい:

Model.group(:p_id).average(:desired) 

あなたの平均値にp_idをマップするハッシュを与えること。あなたはまだBigDecimalの平均を取得しますが、それは本当に問題ではありません。 @

+0

MUが-ある-にショート は、あなたの答えをありがとう、それは良い説明だが、どこ二つのものです:私はまだ私は6を持っている原因摘む使用する必要がBigDecimalの 2と 1.あなたのコードの戻りハッシュ異なる分野での異なる計算。 –

+0

しかし、BigDecimalの問題点は何ですか? –

0

最後に私が見つけた解決策:

Model.group(:p_id).pluck("p_id, AVG(Round(desired))") 
=> [[1,7.76666666666667],[2,43.1666666666667], ...] 
関連する問題