rails 3.2 / postgres - 如何强制SUM()返回整数而不是字符串?

时间:2014-06-24 20:12:35

标签: ruby-on-rails postgresql rails-activerecord

像SUM(foo)这样的Postgres聚合返回一个字符串,即使foo是一个整数。

如何将和转换为整数,以便得到的关系数组包含整数而不是字符串?

我尝试使用:: integer

来强制转换它
  

Widget.select(" SUM(points)as totalpoints :: integer,agent,company")

但是postgres会抛出错误PG::Error: ERROR: syntax error at or near "::"

似乎应该有一些方法来告诉rails - 没有迭代遍历每个返回的数组元素 - INT的SUM是INT吗?

1 个答案:

答案 0 :(得分:1)

这可能只是ActiveRecord适配器。不过,我对此并不完全确定。但是我认为当你选择级别的API时,它只会返回字符串,因为它实际上是从数据库读取的内容。当您使用更高级别的API时,我认为它知道如何将其转换回Ruby类型,因为它了解您的架构。

我无法在上面复制您的查询,但我做了以下事情:

Widget.connection.select_rows("SELECT sum(id) FROM widgets")

这返回:

[
    [0] [
        [0] "887"
    ]
]

如果我使用更高级别的API:

2.0.0-p353 :034 > Widget.sum('id')
D, [2014-06-24T15:34:52.644852 #95176] DEBUG -- :    (0.5ms)  SELECT SUM("widgets."."id") AS sum_id FROM "widgets"
887

此时它在我的控制台中给了我一个Integer类型。所以我怀疑Postgres没有错,但是当你使用ActiveRecord select API时,你可能需要自己转换为原生类型。