我正在使用红宝石,sinatra,postrges和续集。我有一个英国房屋价格数据库,其中一个字段是价格。我已经尝试过数字,整数,货币和真实数据类型,这都是一场灾难。目前我使用的是数字(8),红宝石代码是:
result = DB[:house_data].select_group(:city).select_append{avg(:price)}.to_a.to_json
,输出为:
[{"city":"BOREHAMWOOD","avg":"0.3035E6"},{"city":"LEIGHTON BUZZARD","avg":"0.2089495E6"},{"city":"LEYBURN","avg":"0.37075E6"},{"city":"KEIGHLEY","avg":"0.68E5"},{"city":"TELFORD","avg":"0.122960714285714286E6"},{"city":"FILEY","avg":"0.18025E6"}]
当然,这是无望的,因为数字(平均值)毫无意义。我尝试了不同类型的查询(再次使用avg),输出总是相似的。例如,下面总是会传递错误消息:
DB[:house_data].where(:city => 'LONDON').avg{:price}
和
DB[:house_data].where(:city => 'LONDON').where(:price > 100000)
都会产生错误,表示无法执行此功能。
问题出在哪里? postgres DB中的查询或数据类型?
答案 0 :(得分:3)
这里真正的问题是JSON没有任意精度数字类型,默认情况下ruby BigDecimal
类型在转换为字符串时使用科学记数法。由于数据库将avg
计算作为任意精度数字返回,因此Sequel使用ruby BigDecimal
类型。
您可以添加BigDecimal#to_json
方法来设置BigDecimal
实例应转换为json的方式。
答案 1 :(得分:0)
没有任何人的表演,但无论如何我已经解决了。问题出在json数据的javascript呈现中。以下是这样做的方法:
addCommas(Math.round(this["avg"]),0)
正确的续集查询是:
result = DB[:house_data].group_and_count(:city).select_append{avg(:price)}.to_a.to_json