Пустые строки в массиве строк postgres удаляются

Рельсы 4 с Postgres 9.2. гем 'pg' версии 0.16.0.

Атрибут модели выглядит в schema.rb следующим образом:

t.string "codes",  array: true

Я пытаюсь сохранить в этом поле следующий массив строк:

["", "a string"]

В таблице базы данных данные для этого поля хранятся как {"","a string"}, чего я и ожидаю.

Однако в Rails получение этого атрибута через model.codes удаляет первый элемент в массиве и возвращает только:

["a string"]

а) Что случилось с (преднамеренно размещенной) пустой строкой, которая была у меня в массиве?

б) Если я заменю пустую строку одним символом пробела, полученный атрибут будет выглядеть нормально ([" ", "строка"]), но я надеюсь, что мне не придется прибегать к тот.


person changingrainbows    schedule 08.08.2013    source источник
comment
Ссылки помогли? Сериализация данных решает вашу проблему?   -  person Powers    schedule 11.08.2013
comment
К сожалению, не совсем. Объекты ActiveModel, к которым осуществляется доступ, больше не являются точным представлением хранимых данных, что является реальной сутью моего вопроса. По общему признанию, сериализация потенциально может сделать мой код работоспособным, но пропускает решение основной проблемы, связанной с тем, что Rails извлекает данные из базы данных, которые не сохраняются. «Более нативная» поддержка Rails для типов массивов данных PG была причиной перехода на Rails 4.   -  person changingrainbows    schedule 14.08.2013


Ответы (2)


После долгих поисков у меня есть кое-что, что должно быть полезно для людей, ищущих решения той же проблемы.

Адаптер Postgres в Rails полагается на внешний гем pg_array_parser для тяжелой работы по эффективному синтаксическому анализу массива и по умолчанию обрабатывает его, если этот гем доступен в проекте.

Перечисленная выше проблема не повторяется при добавлении этого драгоценного камня в мой пакет, и все доступ/сохранение данных ведут себя так, как ожидалось, без удаления пустых строк из массива.

Соответствующая строка в Rails:

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql/array_parser.rb#L18

person changingrainbows    schedule 14.08.2013
comment
Итак, это ошибка в Rails? Как он выполняет синтаксический анализ при отсутствии pg_array_parser? - person davetapley; 25.11.2013
comment
Ага, @dukedave. Это ошибка Rails. В главном файле Rails, опубликованном в ответе, обработка массива по умолчанию в отсутствие pg_array_parser выполняется локальным методом с именем parse_array_contents. У меня еще не было возможности просмотреть его и отправить вопрос на Github. Это оператор case в цикле while, который выполняет итерацию по массиву, поэтому за ним должно быть легко следить. Из того, что я вижу в кодовой базе, я предполагаю, что команда Rails/pg намеренно предпочитает переложить ответственность за синтаксический анализ массива на гем, что я и советую для вашего проекта, если это возможно. - person changingrainbows; 25.11.2013

Эти статьи могут помочь:

  1. Сохранение массивов в базе данных с помощью ActiveRecord
  2. rails хранит массив в поле базы данных
  3. http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-serialize

Похоже, вам нужно сериализовать столбец:

class MyStuff < ActiveRecord::Base  
  serialize :things
end
person Powers    schedule 08.08.2013