6

我正在尝试将大约 2K 记录播种到模型中,并且到目前为止我已经尝试使用所有不同的方法(更快的 csvfast_seederrailscasts 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

把它放在你的 lib/tasks 文件夹中,扩展名为 .rake 并运行它:“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 回答