2017-01-25 3 views
0

Мне удалось заставить Roo Gem работать, чтобы импортировать файл Excel и сохранить его в базе данных моего приложения. Это было успешным несколько раз, но, похоже, в электронных таблицах, содержащих пробелы в определенных строках, возникает ошибка. Мой код выглядит следующим образом:Сохранение пустых ячеек Excel в Rails Postgres Database

требует «сл»

xlsx = Roo::Excelx.new(File.expand_path('../Downloads/LOCATION.xlsx')) 

xlsx.each_row_streaming(offset: 1) do |row| 
    Location.find_or_create_by(ukprn: row[0]&.value, accomurl: row[1]&.value, instbeds: row[2]&.value, instlower: row[3]&.value, instupper: row[4]&.value, locid: row[5]&.value, name: row[6]&.value, lat: row[7]&.value, long: row[8]&.value, locukprn: row[9]&.value, loccountry: row[10]&.value, privatelower: row[11]&.value, privateupper: row[12]&.value, suurl: row[13]&.value) 
end 

Я прочитал, что Руби 2.3.0, включив & перед методом он не включает в себя нулевые ошибки методы, поэтому я надеюсь, что это должно сработать.

Первой 4 строки, кажется, работает хорошо, но, как он попадет в строку с пробелами в Ниже приведен фрагмент кода ошибки я получаю:

Location Load (1.1ms) SELECT "locations".* FROM "locations" WHERE "locations"."ukprn" = $1 AND "locations"."accomurl" = $2 AND "locations"."instbeds" IS NULL AND "locations"."instlower" = $3 AND "locations"."instupper" = $4 AND "locations"."locid" = $5 AND "locations"."name" = $6 AND "locations"."lat" = $7 AND "locations"."long" IS NULL AND "locations"."locukprn" = $8 AND "locations"."loccountry" = $9 AND "locations"."privatelower" = $10 AND "locations"."privateupper" = $11 AND "locations"."suurl" = $12 LIMIT $13 [["ukprn", "10000055"], ["accomurl", "http://www.brookes.ac.uk/studying-at-brookes/accommodation/halls-in-detail/"], ["instlower", 4081], ["instupper", "4684"], ["locid", "6463"], ["name", "AB"], ["lat", "Abingdon & Witney College (Abingdon Campus)"], ["locukprn", 51], ["loccountry", "-1.28696"], ["privatelower", 10000055], ["privateupper", "XF"], ["suurl", "4219"], ["LIMIT", 1]] 
ActiveRecord::StatementInvalid: PG::InvalidTextRepresentation: ERROR: invalid input syntax for type numeric: "Abingdon & Witney College (Abingdon Campus)" 
: SELECT "locations".* FROM "locations" WHERE "locations"."ukprn" = $1 AND "locations"."accomurl" = $2 AND "locations"."instbeds" IS NULL AND "locations"."instlower" = $3 AND "locations"."instupper" = $4 AND "locations"."locid" = $5 AND "locations"."name" = $6 AND "locations"."lat" = $7 AND "locations"."long" IS NULL AND "locations"."locukprn" = $8 AND "locations"."loccountry" = $9 AND "locations"."privatelower" = $10 AND "locations"."privateupper" = $11 AND "locations"."suurl" = $12 LIMIT $13 
    from /home/dave/.rvm/gems/ruby-2.3.3/gems/activerecord-5.0.1/lib/active_record/connection_adapters/postgresql_adapter.rb:606:in `exec_prepared' 

Я предполагаю, что Postgres не довольствуется с нулевыми данными сохраняются в базе данных и, следовательно, «Abingdon & Witney College (Абиндон Campus)» перемещен в другую колонку, потому что соответствующая запись является строка, как показано на миграционный записи ниже:

class CreateLocations < ActiveRecord::Migration[5.0] 
    def change 
    create_table :locations do |t| 
     t.text :name 
     t.decimal :lat 
     t.decimal :long 
     t.string :locid, index: true 
     t.integer :locukprn 
     t.string :loccountry 
     t.integer :privatelower 
     t.string :privateupper 
     t.string :ukprn, index: true 
     t.string :suurl 
     t.string :accomurl 
     t.integer :instbeds 
     t.integer :instlower 
     t.string :instupper 
     t.references :institute, foreign_key: true, index: true 
    end 
    end 
end 

это то, что происходит неправильно, и есть любые предложения относительно того, как решить это?

+0

'Ошибка: недопустимый синтаксис ввода для типа Числовой:«Абиндон & Witney колледж (Абиндон Campus)» 'Я, возможно, читаю это неправильно, но это значение не является числовым? – whodini9

+0

Но ни данные в схеме, это «текст», поскольку он находится под столбцом «name». –

ответ

0

Ваш Выбор есть:

[ 
(0)["ukprn", "10000055"], 
(1)["accomurl", "http://www.brookes.ac.uk/studying-at-brookes/accommodation/halls-in-detail/"], 
(2)["instlower", 4081], 
(3)["instupper", "4684"], 
(4)["locid", "6463"], 
(5)["name", "AB"], 
(6)["lat", "Abingdon &amp; Witney College (Abingdon Campus)"], 
(7)["locukprn", 51], 
(8)["loccountry", "-1.28696"], 
(9)["privatelower", 10000055], 
(10)["privateupper", "XF"], 
(11)["suurl", "4219"], 
(12)["LIMIT", 1] 
] 

Это лат значение не является числовым и ваша миграция t.decimal :lat

+0

Как указано в вышеприведенном комментарии, эта запись находится в строке 6 и поэтому должна находиться под «именем», которая является форматом «текст» в соответствии с миграцией. –

+0

Мне кажется, что 'find_or_create' имеет' locations.lat', тянущееся от 'row [7]', и, таким образом, 'SELECT' делает' "местоположения". "Lat" = $ 7 'Имя находится в 6 справа? – whodini9

+0

Да, должно быть. «Abingdon & Witney College (Abingdon Campus)» происходит из строки 6 таблицы, поэтому, почему я не понимаю ошибку. –

Смежные вопросы