You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rails中查询JSONB字段的嵌套数组并返回字符串数组

问题

我在Rails里执行这段SQL查询:

Book.connection.execute("SELECT books.content -> 'summaries' from books INNER JOIN authors where books.author_id = authors.id")

返回的结果是序列化后的字符串数组:'["summary 1", "summary 2",...]',怎么让它直接返回字符串数组?

解决办法

1. 用PostgreSQL的数组处理函数(推荐)

如果你的content是jsonb类型,修改SQL语句,用jsonb_array_elements_text把数组拆成单行,再用array_agg聚合回去:

result = Book.connection.execute("SELECT array_agg(jsonb_array_elements_text(books.content -> 'summaries')) FROM books INNER JOIN authors ON books.author_id = authors.id")
final_array = result.first['array_agg']

要是字段是json类型,把jsonb_array_elements_text换成json_array_elements_text即可。

2. Ruby层面解析序列化字符串

不想改动SQL的话,直接在Ruby里把返回的字符串转成数组:

raw_data = Book.connection.execute("SELECT books.content -> 'summaries' from books INNER JOIN authors where books.author_id = authors.id")
final_array = raw_data.map { |row| JSON.parse(row.values.first) }.flatten

遍历每一行结果,把每个JSON字符串解析成数组,再合并成一个完整的字符串数组。

3. 用ActiveRecord风格查询(更贴合Rails)

先确保Book模型里有belongs_to :author的关联,并且content字段在迁移中设为jsonb或json类型,然后用Rails原生查询语法:

final_array = Book.joins(:author).pluck("content -> 'summaries'").flat_map { |json_str| JSON.parse(json_str) }

或者直接结合PostgreSQL函数一步到位:

final_array = Book.joins(:author).pluck("jsonb_array_elements_text(content -> 'summaries')")

这样查询出来的结果直接就是拆分好的字符串数组,无需额外解析。

内容的提问来源于stack exchange,提问作者user2167582

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:52:10