2017-01-24 16 views
2

Я ищу для извлечения довольно большого количества данных из электронных таблиц для приложения Rails, но я делаю извлечение через консоль Rails.Извлечь данные из таблицы Excel в базу данных в Ruby

У меня есть таблица под названием instititutes в моей базе данных, которая в настоящее время насчитывает около 170 записей. Я нашел гораздо лучшие данные в электронной таблице с записями c.1000 и хочу импортировать их в мою базу данных, но пропустить любые записи, которые уже соответствуют.

Я думал, что использование метода find_or_create_by будет лучшим для этого. Таблица содержит UKPRN и NAME в качестве заголовков, а таблица имеет ukprn и name как соответствующие столбцы (а также другие).

Используя камень Roo, я получил это до сих пор:

require 'roo' 

xlsx = Roo::Spreadsheet.open(File.expand_path('../Downloads/UKPRN.xlsx')) 
xlsx.default_sheet = xlsx.sheets.last 
header = xlsx.row(1) 
xlsx.each_row do |row| 
    row = Institute.find_or_create_by(UKPRN: ukprn , NAME: name) 
end 

Это дает ошибку NameError: unitialized constant UKPRN. Я все еще возвращаю голову в Ruby, поэтому любая помощь будет оценена по достоинству.

Я использую Ruby, Rails 2.2.3 и 5.0.1

Edit:

p row показывает:

["UKPRN", "NAME"] 
[10000291, "Anglia Ruskin University"] 
[10000385, "The Arts University Bournemouth"] 
[10000571, "Bath Spa University"] 
[10000712, "University College Birmingham"] 
[10000824, "Bournemouth University"] 
[10000886, "The University of Brighton"] 
[10000961, "Brunel University London"] 
...etc 
+0

Что выводит 'p row' внутри' each_ row'? Без 'row = Institute ...' –

ответ

0

Ваша таблица имеет ukprn и name в соответствующие столбцы, так find_or_create которые должен выглядят так:

Institute.find_or_create_by(ukprn: ukprn , name: name) 

Теперь вам нужно только инициализировать ukprn и name от row.

require 'roo' 

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

xlsx.each_row_streaming(offset: 1) do |row| 
    Institute.find_or_create_by(ukprn: row[0].value, name: row[1].value) 
end 

Чтобы выполнить этот код, либо:

  • положить его в db/seeds.rb и выполнить rake db:seed
  • положить его в script.rb и запустить rails runner script.rb
  • копипаст его в консоли (на самом деле не рекомендуется)
+0

Извинения, но какой будет лучший способ сделать это с консоли? –