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

Ruby on Rails测试夹具中无法创建哈希数组的问题求助

Rails测试Fixture中PostgreSQL jsonb哈希数组的正确写法

我用Ruby on Rails搭配PostgreSQL,为了性能用jsonb字段存储哈希数组(未拆分至单独表),生产环境运行正常,但编写测试Fixture时,无法通过标准方式创建哈希数组:

数据库表结构

CREATE TABLE IF NOT EXISTS public.circles
(
    id bigint NOT NULL DEFAULT nextval('circles_id_seq'::regclass),
    blob jsonb
)

已验证可行的场景

纯数组或单个哈希的Fixture写法均可正常运行:

templatecircle_1:
  blob: <%= [1, 2] %>
templatecircle_1:
  blob: {"abc": "def"}

问题现象

尝试创建包含哈希的数组时,如下两种写法都会触发ActiveRecord::Fixture::FormatError,报错提示YAML解析异常:

templatecircle_1:
  blob: <%= [1, {"abc": "def"}] %>
templatecircle_1:
  blob: <%= JSON.parse("[1, {\"abc\": \"def\"}]") %>

报错信息:

Please note that YAML must be consistently indented using spaces. Tabs are not allowed. Error: (): did not find expected node content while parsing a flow node at line 2 column 11

解决方案

方法1:通过ERB将Ruby对象转为JSON字符串

直接把哈希数组转成标准JSON字符串,Rails会自动将其写入jsonb字段:

templatecircle_1:
  blob: <%= [1, {"abc": "def"}].to_json %>

这种写法输出纯JSON字符串,避免了YAML解析冲突,Fixture能正确识别处理。

方法2:直接使用YAML嵌套语法

无需ERB,用YAML原生的数组+哈希格式编写,Rails会自动将该结构序列化为jsonb:

templatecircle_1:
  blob:
    - 1
    - abc: def

该写法完全符合YAML语法规则,不会触发解析错误,最终会生成包含整数和哈希的数组存入jsonb字段。

报错原因说明

之前的写法失败是因为:

  • 直接输出Ruby数组的字符串表示(如[1, {:abc=>"def"}])并非有效的JSON/YAML格式,Fixture解析YAML时无法识别
  • JSON.parse写法中,转义的双引号在YAML语境下处理不当,导致YAML解析器报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:57:39