如何使用postgresql和Sequel ORM获取数值数据类型?

时间:2014-02-22 04:58:25

标签: ruby postgresql sequel

我正在使用红宝石,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中的查询或数据类型?

2 个答案:

答案 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