2017-01-24 14 views
2

Railsアプリケーションのスプレッドシートからかなりのデータを抽出することを検討していますが、Railsコンソールから抽出しています。ExcelスプレッドシートからRubyのデータベースにデータを抽出する

私のデータベースには現在約170のレコードがあるテーブルinstititutesがあります。私はc.1000レコードのスプレッドシートではるかに優れたデータを見つけて、それをデータベースにインポートしたいが、すでに一致しているレコードはスキップしたい。

私はfind_or_create_byメソッドを使用することがこれのための最良の方法だと思っていました。スプレッドシートはヘッダーとしてUKPRNNAMEを持ち、表はukprnnameをそれぞれの列(および他のもの)として持っています。 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の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 
+0

'p行'は 'each_行? '行=研究所... 'がなければ –

答えて

0

あなたのテーブル、そうfind_or_createがすべきukprnnameとして各列を持っています次のようになります。

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

ukprnnamerowから初期化するだけです。このコードを実行する

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

謝罪しますが、コンソールからこれを行う最良の方法は何でしょうか? –

関連する問題