Перевести строку сериализованного вложенного массива в массив postgres в rails

#ruby-on-rails #postgresql

#ruby-on-rails #postgresql

Вопрос:

В Rails 5.0 у нас есть атрибут модели, сериализованный в строки YAML, которые принимают вложенные массивы:

 class Foo
  serialize :foos, Array
end
  

Если я посмотрю на пример myFoo.foos в базе данных, это может выглядеть следующим образом:

 ---
- - Foo A
- - Foo B 1
  - Foo B 2
  - Foo B 3
  

или в rails это было бы: [['Foo A'], ['Foo B 1', 'Foo B 2', 'Foo B 3']]

Я хочу создать миграцию столбца, переместив его из сериализованного текста в тип массива Postgres.

Если бы это не были вложенные массивы, мы могли бы сделать что-то подобное при миграции:

 change_column :foos, :foos, :string, array: true, default: [], using: "(string_to_array(foos, ','))"
  

Но это не работает для вложенных массивов; это создаст единый массив с сериализованным фрагментом внутри, что-то вроде:

 ["---n- - Foo 1n- - Foo 2 An  - Foo 2 Bn  - Foo 2 C"]
  

Есть идеи о волшебной функции postgres, которая может работать string_to_array вложенным образом? Я пытался unnest , но это не позволяет вам возвращать набор в преобразование, поэтому я в растерянности.

Комментарии:

1. (1) Вы уверены, что хотите использовать varchar[][] внутри базы данных? Я подозреваю, что это jsonb лучше интегрировалось бы с Rails. (2) Сколько данных вам нужно преобразовать? Разбор YAML внутри базы данных будет неприятным.

2. Я открыт для предложений, я не думал, что это varchar[][] будет плохо для базы данных. Мы рассматривали jsonb но я выбрал тип массива просто потому, что он обычно выполняется быстрее. Но, возможно, это не относится к вложенным массивам?

3. С базой данных все должно быть в порядке text[][] , меня бы больше беспокоили некоторые проблемы с интерфейсом PostgreSQL-Rails. Если разница в производительности будет проблемой, то вам, вероятно, будет лучше использовать отдельные таблицы, а не составные типы столбцов. Я тут немного поработал руками, чтобы сравнить различные подходы с реальными данными и посмотреть, таковы ли различия, как мы думаем, и достаточно ли они велики, чтобы о них беспокоиться.