【问题标题】:how can I get numeric data type to work with postgresql and Sequel ORM?如何让数字数据类型与 postgresql 和 Sequel ORM 一起使用?
【发布时间】:2014-02-26 00:50:08
【问题描述】:

我正在使用 ruby​​、sinatra、postrges 和 sequel。我有一个英国房价数据数据库,其中一个字段是价格。我已经尝试过数字、整数、金钱和真实数据类型,这一切都是一场灾难。目前我使用的是 numeric(8),ruby 代码是:

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)是没有意义的。我尝试了不同类型的查询(再次使用 avg)并且输出总是相似的。例如,以下总是传递错误消息:

DB[:house_data].where(:city => 'LONDON').avg{:price}

DB[:house_data].where(:city => 'LONDON').where(:price > 100000)

两者都会产生错误,说明无法执行该功能。

问题出在哪里? postgres 数据库中的查询或数据类型?

【问题讨论】:

    标签: ruby postgresql sequel


    【解决方案1】:

    这里真正的问题是 JSON 没有任意精度的数字类型,而 ruby​​ BigDecimal 类型在转换为字符串时默认使用科学记数法。由于数据库将 avg 计算作为任意精度数字返回,因此 Sequel 使用 ruby​​ BigDecimal 类型。

    您可以添加BigDecimal#to_json 方法来设置应如何将BigDecimal 实例转换为json。

    【讨论】:

    • 谢谢 Jeremy,我会尝试一下。首先,我需要了解 Bigdecimal,它对我来说是一个新的。
    【解决方案2】:

    没有人显示,但无论如何我已经解决了。问题在于 json 数据的 javascript 渲染。方法如下:

    addCommas(Math.round(this["avg"]),0)
    

    正确的后续查询是:

    result = DB[:house_data].group_and_count(:city).select_append{avg(:price)}.to_a.to_json
    

    【讨论】:

      猜你喜欢
      • 2013-05-15
      • 1970-01-01
      • 2019-04-22
      • 2012-04-13
      • 2018-03-11
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多