#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. Если разница в производительности будет проблемой, то вам, вероятно, будет лучше использовать отдельные таблицы, а не составные типы столбцов. Я тут немного поработал руками, чтобы сравнить различные подходы с реальными данными и посмотреть, таковы ли различия, как мы думаем, и достаточно ли они велики, чтобы о них беспокоиться.