6

約 2K のレコードをモデルにシードしようとしていますが、これまでにさまざまな方法をすべて使用してみました (より高速な csvfast_seeder、およびrailscasts ep )。これはかなりシンプルであるべきだと思います。CSV ファイルにすべてのデータがあり、モデルはすでにセットアップされており、シードする準備ができています。

これまでに機能したのは、RailsCasts エピソードで示されたものだけです。私は自分の属性にこのコードをプラグインし、最初の行のみ (2K のうち) をシードしました。それだけです:

Country.delete_all
open("#{Rails.root}/path_to_my_file") do |models|
  models.read.each_line do |model|
     column_1, column_2, column_3, column_4 = model.chomp.split(",")
     Model.create!(:attr_1 => column_1, :attr_2 => column_2, ...etc)
  end
end

次にFasterCSV、他の質問のいくつかに基づいて使用してみましたがfastercsv、Ruby の最新リリースに既に含まれているというエラーがたくさん表示され、理解できなかったようです (これは私のせいかもしれませんが、私はそれをうまくレイアウトする良いSOの質問を見つけることができませんでした)。

最後に、Fast_Seederいくつかの可能性があるようで、すべてのエントリを認識しましたが、次のエラーを受け取ったため、それらのいずれもモデルに保存しませんでした:

SQLite3::SQLException: too many terms in compound SELECT:(all my columns)

とにかく、これは十分に単純であるべきだと思います。2K のエントリを含む CSV と、シードする必要がある空のモデルがあります。これを行うための最良の方法は非常に高く評価されます、ありがとう!

4

2 に答える 2

14

これで私が見た最高の成功は、rake タスクを実行することです。

require 'csv'

namespace :csv do

  desc "Import CSV Data"
  task :import_stuff => :environment do

    csv_file_path = 'db/data.csv'

    CSV.foreach(csv_file_path) do |row|
      Model.create!({
        :column1 => row[0],
        :column2 => row[1],
        :column3 => row[2],        
      })
      puts "Row added!"
    end
  end
end

これを .rake 拡張子を付けて lib/tasks フォルダーに入れ、実行するには「rake csv:import_stuff」と入力します。

また、SQL lite でいくつかの制限に達している可能性があります... MongoDB をチェックアウトすることをお勧めします。今のあなたの状況にぴったりのようです。幸運を!

于 2012-08-20T09:02:26.953 に答える
4

わかったみたいですね、すみません。改善が必要な場合は、このコードに関するコメントをいただければ幸いです。

とにかく、fasterCSV(またはCSVのみ)を使用して理解したと思います。これはうまくいったようです:

require 'csv'

Model.delete_all
CSV.foreach("#{Rails.root}/lib/data/model.csv") do |row|
     Model.create!(:attr_1 => row[0], :attr_2 => row[1], :attr_3 => row[2], etc)
end
于 2012-08-19T17:32:19.927 に答える