【问题标题】:Rails PostgreSql store multidimensional arrayRails PostgreSql 存储多维数组
【发布时间】:2019-05-20 17:25:13
【问题描述】:
是否可以在一列中存储多维数组。
我已尝试以下操作,并收到以下来自创建记录列的错误。
迁移文件.rb
create_table :balance_sheets_details do |t|
t.string :headers, array: true, default: []
t.string :records, array: true, default: [[]]
t.timestamps
end
引发错误
PG::InvalidTextRepresentation:错误:格式错误的数组文字:“{{}}”
【问题讨论】:
标签:
ruby-on-rails
postgresql
rails-models
【解决方案1】:
来自有关数组的文档(已添加重点):
CREATE TABLE 的语法允许指定数组的确切大小,例如:
CREATE TABLE tictactoe (
squares integer[3][3]
);
但是,当前实现忽略任何提供的数组大小限制,即行为与未指定长度的数组相同。
当前的实现也不强制声明的维数。特定元素类型的数组都被认为是同一类型,无论大小或维数如何。因此,在CREATE TABLE 中声明数组大小或维数只是文档;它不会影响运行时行为。
因此,实际上并不存在多维数组类型。要解决您的问题,只需将默认值从 {{}} 更改为 {}。
这意味着varchar[][] 与varchar[] 的类型相同:
db=# select pg_typeof(a), pg_typeof(b) from (values ('{{hello},{world}}'::varchar[][], '{foo}'::varchar[])) x(a, b);
pg_typeof | pg_typeof
---------------------+---------------------
character varying[] | character varying[]
(1 row)
不过,您仍然可以存储多维数据。
一维数组和二维数组不一样:
db=# select '{{foo}}'::varchar[] = '{foo}'::varchar[];
?column?
----------
f
(1 row)