2017-02-26 6 views
0

は、だから私はRailsの4.2.7キャストはActiveRecordのを返す:: StatementInvalid:Mysql2 ::エラー

@product.reviews.select('CAST(answer_1 AS FLOAT) AS answer_1')

に次のようにやっている残念ながら、これは

ActiveRecord::StatementInvalid: Mysql2::Error: 
You have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near 
'FLOAT) AS answer_1 FROM `reviews` WHERE `reviews`.`product_id` = 1' at line 1: 
SELECT CAST(answer_1 AS FLOAT) AS answer_1 
FROM `reviews` WHERE `reviews`.`product_id` = 1 
+0

本当に、私がする必要があるのは 'AVG(CAST(answer_1 AS FLOAT))AS answer_1'ですが、キャスティングを動作させることができません。 – Abram

答えて

2

を返しどうやらMySQLのcast機能は」doesnのデータ型としてfloatを理解してください。 fine manualはタイプについてconvertを見るよう指示し、floatはリストにありません。

しかし、castdecimal(m,n)をサポートしていますが、適切な縮尺と精度の値を自分で選択する必要があります。または、整数が適切な場合は、cast(answer_1 as signed)またはcast(answer_1 as unsigned)を使用できます。

​​が既に数値である場合は、avgで浮動小数点値を返します(ただし、もちろんこれは明示的ではありません)。

また、あなたの列の別名ためにいくつかの問題に実行できます。

avg(answer_1) as answer_1 

は、既存の列と同じ名前を持ちます。 ActiveRecordはおそらく名前で混乱し、平均値を​​列に変換しようとします。別の名前を使用すると効果的です。

+0

これは奇妙なことですが、 'AVG(answer_1)AS answer_1'を実行すると' @ product.reviews.select( 'AVG(answer_1)AS answer_1')というクエリを介して 'Fixnum Abram

+1

これは、 'answer_1'カラムが整数でActiveRecordが' avg(answer_1)as answer_1'を 'fixnum'に変換していることを示唆しています。あなたの 'select'呼び出しで別のエイリアスを与えてみてください。 –

+0

ビンゴ。 '.select( 'AVG(answer_1)AS foo')'私にフロートを与える – Abram

関連する問題