21

我知道这个问题在这个论坛上被问了很多,但我在一个严格的期限内,我需要一些帮助,所以任何建议都非常感谢。我是 Ruby on Rails 的新手,所以在回复时请记住这一点。我想创建一个 rake 任务,它在运行时会更新 mysqlite db 中的多个表。这是一个迁移文件,它在我的数据库中创建了一个新事件。如何创建将通过 CSV 文件输入所有这些信息的 rake 任务。有人可以帮助我从头到尾编写 rake 文件吗?显然您不需要为每个字符串编写每个任务,只需举几个例子。除了实际的 rake 文件之外,我是否需要向我的应用程序的任何其他部分添加代码(我知道这是一个非常笼统的问题,但如果我确实需要添加代码,我会很感激对位置的一般描述)。我觉得会有一点指导。如果有人需要我提供更多信息,请询问。

class CreateIncidents < ActiveRecord::Migration
  def self.up
    create_table :incidents do |t|
      t.datetime :incident_datetime
      t.string :location
      t.string :report_nr
      t.string :responsible_party
      t.string :area_resident
      t.string :street
      t.string :city
      t.string :state
      t.string :home_phone
      t.string :cell_phone
      t.string :insurance_carrier_name
      t.string :insurance_carrier_street
      t.string :insurance_carrier_city
      t.string :insurance_carrier_state
      t.string :insurance_carrier_phone
      t.string :insurance_carrier_contact
      t.string :policy_nr
      t.string :vin_nr
      t.string :license_nr
      t.string :vehicle_make
      t.string :vehicle_model
      t.string :vehicle_year


      t.timestamps
    end
  end

  def self.down
    drop_table :incidents
  end
end
4

5 回答 5

21

在 lib/task 的项目文件夹下创建一个 rake 文件,例如“import_incidents_csv.rake”

按照这个 Ruby on Rails - 从 CSV 文件导入数据

在 rake 文件中有以下代码

require 'csv'
namespace :import_incidents_csv do
  task :create_incidents => :environment do
    "code from the link"  
  end
end 

您可以将此任务称为“rake import_incidents_csv:create_incidents”

于 2012-09-17T14:25:02.710 回答
11

我一天为此工作了好几个小时。我终于通过执行以下操作使其工作:

  1. 在我的 csv 文件的第一行中添加了一个标题,该标题反映attr_accessible在我的模型中。在我的情况下,我的模型是attr_accessible :intro:name在我的 csv 文件中,第一行读取名称,介绍。
  2. 创建了一个自定义 rake 文件。我命名了我的 import.rake 并将其放在 lib/tasks 文件夹中。将此代码放在该文件中:
#lib/tasks/import.rake
require 'csv'
desc "Imports a CSV file into an ActiveRecord table"
task :import, [:filename] => :environment do    
    CSV.foreach('myfile.csv', :headers => true) do |row|
      MyModel.create!(row.to_hash)
    end
end

然后bundle exec rake import在命令行中输入。

为了让它工作,我有相当的 SQLite 数据库浏览器。我希望对某人有所帮助!

于 2012-12-20T12:41:13.413 回答
2

这是我使用 rake db:seed 导入的示例 CSV。我把它写到了seeds.rb 文件中,然后把CSV 文件放到了/public/seed_data/zip_code.csv 中。这很容易解释(即 csv 有三列:代码、长列和纬度。

代码解析每一行,提取相关数据并将其分配给局部变量,然后将其写入记录。希望能帮助到你。

File.open("#{Rails.root}/public/seed_data/zip_code.csv") do |zip_codes|
  zip_codes.read.each_line do |zip_code|
    code, longitude, latitude = zip_code.chomp.split(",")
    #  to remove the quotes from the csv text:
    code.gsub!(/\A"|"\Z/, '')
    # to create each record in the database
    ZipCodeGeo.create!(:zip_code => code, :longitude => longitude, :latitude =>      latitude)             
  end
end
于 2012-09-18T01:38:49.103 回答
0

您可以使用CSVrails 模块读取 csv 文件并创建记录。这是详细的帮助:使用 csv 填充数据库

于 2013-02-26T10:29:13.253 回答
0

我过去用过这个。它需要任何类型的模型。

rake csv_model_import[bunnies.csv,Bunny]

奇迹般有效。

desc "Imports a CSV file into an ActiveRecord table"
task :csv_model_import, :filename, :model, :needs => :environment do |task,args|
  lines = File.new(args[:filename]).readlines
  header = lines.shift.strip
  keys = header.split(',')
  lines.each do |line|
    params = {}
    values = line.strip.split(',')
    keys.each_with_index do |key,i|
      params[key] = values[i]
    end
    Module.const_get(args[:model]).create(params)
  end
end

于 2014-10-09T23:40:07.100 回答