Rails PostgreSql хранит многомерный массив - PullRequest
0 голосов
/ 20 мая 2019

Можно ли хранить многомерный массив в столбце.

Я попробовал следующее и получил ошибку ниже при создании столбца записей.

migration_file.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: ОШИБКА: литерал некорректного массива: "{{}}"

1 Ответ

1 голос
/ 21 мая 2019

Из документов на массивах (выделение добавлено):

Синтаксис для 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...