Загрузка Ruby on Rails Postgresql Array CSV - PullRequest
0 голосов
/ 31 мая 2018

Это приложение Rails (с использованием postgresql db) импортирует данные из CSV для создания новых записей модели "Клиент".Импорт в Models / client.rb выглядит следующим образом:

    def self.import(file, industry)
    CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row|
        industry.clients.create! row.to_hash
    end

Это правильно работает при создании записей и заполнении атрибутов каждой записи в соответствии с данными CSV для всех типов записей, кроме массива.

Клиенты имеют атрибут типа массива «электронные письма» (среди других атрибутов массива).Атрибуты массива были созданы в миграции следующим образом:

add_column :clients, :emails, :text, array: true, default: []

В CSV они хранятся в таких ячейках:

["email1@domain.com","email2@domain.com", "email3@domain.com"]

После загрузки эти сообщения электронной почты будут отображаться на моем локальном сервере:

INSERT INTO "клиенты"... [" emails "," {\ "email1@domain.com", \ "email2@domain.com \"} "]

Как видите, он отрубаеттретий элемент массива "email3@domain.com", и это верно для последнего элемента всех массивов, загруженных из CSV.

Я предполагаю, что тип массива Postgresql имеет проблемы с форматом, в котором массив сохраняется в CSV (- ["element1", "element2", ...]) - Iпробовал несколько разных форматов, но пока безуспешно.Есть мысли о том, как это сделать?

1 Ответ

0 голосов
/ 01 июня 2018

Вместо того, чтобы пытаться загрузить эти атрибуты в виде массива, я изменил миграцию на обычную строку.

add_column :clients, :emails, :string

После того, как я загрузил данные CSV в приложение rails с помощью:

def self.import(file, industry)
CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row|
    industry.clients.create! row.to_hash
end

Сейчас я просто беру эту строку и использую ее для манипулирования данными:

JSON.parse(@client.emails)

Поскольку данные, загруженные из ячейки CSV, уже имеют формат, который работает с JSON.parse: ["element1", "element2", "element3", ...], это был эффективный метод.

* ПРИМЕЧАНИЕ Это не дает точного результата, который требуется в моем опубликованном вопросе, но функционально служит той же цели, что и в этом приложении rails.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...