【问题标题】:Postgres treat selected json_agg'regated string as an arrayPostgres 将选定的 json_agg'regated 字符串视为一个数组
【发布时间】:2021-07-20 19:12:20
【问题描述】:

在以下查询 (*) 中,我发现 foo_ids 作为数组的字符串表示形式返回。当我最终在 ActiveRecord::Base.connection.select_all 结果上运行 to_json 时,我看到它当然在结果输出中被表示为字符串。

SELECT
  bar.a,
  bar.b,
  bar.c,
  (
    SELECT JSON_AGG(DISTINCT foo_id)
    FROM foo
    WHERE bar.id = foo.bar_id
  ) AS foo_ids
FROM bar

我可以做些什么来将所需的选择作为一个数组放入最终的 JSON 输出中,而无需修改中间结果?

(*) 该问题的查询已被简化。

【问题讨论】:

  • 也许改用ARRAY_AGG
  • @AbM 我已经试过了 - 它提供了不同的数组表示法输出,但仍然是字符串包装的,例如"{30,31}"
  • 我可能会以某种方式将列转换为数组,例如'{1,1}'::int[]

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


【解决方案1】:

我在@unabridged 对这个问题的回答的帮助下解决了这个问题:Getting typed results from ActiveRecord raw SQL

我还使用了array_agg 而不是json_agg 来确保数据是一个数组,以便稍后转换为 JSON。

我得出的结论是,没有办法解决这个问题,我只需要找到一种合适的方法来使用 ActiveRecord 转换类型,如下所示:

result = ActiveRecord::Base.connection.select_all(query)
  .to_a.map { |o| o.each { |k, v| o[k] = result.column_types[k].cast(v) } }

query 是 SQL 字符串。

【讨论】:

  • 你为什么使用ActiveRecord::Base.connection.select_all?你不能用Bar.joins(:foos).select('bar.a, bar.b, bar.c, array_agg(foo.id) as foo_ids').group(:id)吗?
  • 我故意避免使用模型,因为它已从代码库中删除 - 此代码用于迁移
猜你喜欢
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多