如何在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
相关产品推荐
相关产品推荐

