postgresql 不能在RoR fixture中使用哈希数组

bkhjykvo  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(111)

我使用Ruby On Rails和PostgreSQL数据库。出于性能原因,我使用了一个jsonb-field和一个哈希数组,而不是将其提取到特定的表中。在真实的世界中,这个斑点看起来像
[ { "row": 1, "price": 0, "column": 1, "status": 1, "index_row": 1, "contingency": 0, "index_column": 1 }, { "row": 1, "price": 0, "column": 2, "status": 1, "index_row": 1, "contingency": 0, "index_column": 2 }... ]
并且工作正常。
现在,我试图增加测试覆盖率,并注意到,我不能使用标准fixture方法创建哈希数组。假设如下:

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

fixture文件circles.yml包含以下内容:

templatecircle_1:
  blob: <%= [1, 2] %>

这在运行bin/rails测试时可以正常工作。

templatecircle_1:
  blob: {"abc": "def"}

这也正如预期的那样。
然而,在这方面,

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

返回ActiveRecord::Fixture::fixture错误:
请注意,YAML必须使用空格一致地缩进。标签是不允许的。错误:():在分析第2行第11列的流节点时未找到预期的节点内容
我甚至尝试使用如下的变通方法:

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

这会产生同样的错误。
有没有人有一个想法,我如何在RoR fixtures中创建一个哈希数组?

kdfy810k

kdfy810k1#

要在YAML fixtures文件中定义“array of hashes”字段,请对每个数组元素使用-表示法,对每个哈希键/值对使用:表示法。不需要ERB语法或JSON解析。就是这样的结构:

# test/fixtures/circles.yml

templatecircle_1:
  blob:
    - row: 1
      price: 0
      column: 1
      status: 1
      index_row: 1
      contingency: 0
      index_column: 1
    - row: 1
      price: 0
      column: 2
      status: 1
      index_row: 1
      contingency: 0
      index_column: 2

之后,您可以在测试中调用

Circle.first.blob
# => [{
#      "row"=>1,
#      "price"=>0,
#      "column"=>1,
#      "status"=>1,
#      "index_row"=>1,
#      "contingency"=>0,
#      "index_column"=>1
#    },
#      "row"=>1,
#      "price"=>0,
#      "column"=>2,
#      "status"=>1,
#      "index_row"=>1,
#      "contingency"=>0,
#      "index_column"=>2
#    }]

正如你所看到的,它将被自动解析
对于[1, {"abc": "def"}],结构为:

# test/fixtures/circles.yml

templatecircle_1:
  blob:
    - 1
    - abc: def

在Ruby中:

Circle.first.blob
# => [1, {"abc"=>"def"}]

也可以使用这样的语法(只需从原始尝试中删除ERB):

# test/fixtures/circles.yml

templatecircle_1:
  blob: [1, {"abc": "def"}]

在Ruby中:

Circle.first.blob
# => [1, {"abc"=>"def"}]

如果由于某些原因仍然需要ERB,可以使用to_json方法

# test/fixtures/circles.yml

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

在Ruby中:

Circle.first.blob
# => [1, {"abc"=>"def"}]

相关问题