Извлечение данных из таблицы Excel в базу данных в Ruby

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

У меня есть стол 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 2.2.3 и Rails 5.0.1

Редактировать:

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

1 ответ

Решение

Ваш стол имеет 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
  • скопируйте и вставьте его в консоль (не очень рекомендуется)
Другие вопросы по тегам