Cast as Float返回ActiveRecord :: StatementInvalid:Mysql2 :: Error

时间:2017-02-26 21:04:16

标签: mysql sql ruby-on-rails activerecord rails-activerecord

所以我在Rails 4.2.7

中执行以下操作

@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

1 个答案:

答案 0 :(得分:2)

显然,MySQL的cast函数不理解float作为数据类型。 fine manual告诉您查看convert类型,列表中没有float

MySQL的cast确实支持decimal(m,n),但您必须自己选择适当的比例和精度值。或者,如果整数合适,您可以使用cast(answer_1 as signed)cast(answer_1 as unsigned)

如果你实际上是平均值并且answer_1已经是一个数字,那么你不需要在avg处输入任何内容,而是在其上返回一个浮点值(但是文档不是显式的当然是这样的。)

您还可能遇到一些问题,因为您的列别名是:

avg(answer_1) as answer_1

与现有列具有相同的名称。 ActiveRecord可能会被名称搞糊涂,并尝试将平均值转换为answer_1列的任何值。使用不同的名称应该会更好。