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_
相关产品推荐
相关产品推荐

