2012-07-16 65 views
4

我正在通过Ruby on Rails 3将数据从CSV文件导入到MySQL数据库中。客户模型已经创建。另外,下面的脚本将生成puts行[2]并正确放置行[3]。当我为customers.warranty_part_no和warranty_part_desc的数据库字段添加分配时,会生成下面的错误。无法在Ruby on Rails中将csv导入到MySQL数据库3

csv = CSV.read(file, col_sep: ",", headers: false) 

c = Customer.new 
csv.each do |row| 
     c.warranty_part_no = row[2], 
     c.warranty_part_desc = row[3] 
end 

这是我得到的错误。

uninitialized constant Customer (NameError) 

一些测试后,我觉得这个问题是因为这样不被具有较大的Rails应用程序,以便客户类从未被创建执行customer.rb模型我从命令行运行此脚本。我如何从命令行运行此脚本并利用ActiveRecord或activerecord-import?如果这不可行,我该如何为它创建一个路线或从应用程序的视图中调用它?

我在Ruby 1.9.2和Rails 3.2.2上。提前感谢您的任何建议。

+3

为什么不使用MySQL的LOAD DATA INFILE ...?见:http://dev.mysql.com/doc/refman/5.1/en/load-data.html – 2012-07-16 17:22:45

+0

是的,我用它来完成其他几项任务。我只保留这个文件中的一些字段。此外,这也将成为屏幕上的一种形式。 – analyticsPierce 2012-07-16 17:27:35

+0

您是否在运行导入之前尝试加载应用程序('require'config/environment'')?丑陋的,但应该让你的模特开火... – rjz 2012-07-18 17:27:31

回答

2

问题,因为你已经发现,是你的Rails环境没有加载。您可以在独立脚本中执行此操作,方法是包括您的Customer model,active_record和使用database.yml建立连接。

但是,有一种更简单的方法。像这样创建一个rake任务:

namespace :data do 
    desc "Import data from CSV" 
    task :import => :environment do 
    #Your script here 
    end 
end 

=> :environment告诉耙加载Rails的让你的数据库连接和所有的车型将只在那里为你使用。

使用rake data:import调用它,如果您想要生产环境,请添加RAILS_ENV=production

1

我相信你要找的是rails runner Rails Command Line Docs这将在你的rails应用程序的环境中执行你的ruby脚本。

如果您只是想在交互式命令shell中访问rails对象,也可以使用rails控制台。通过导轨控制台

3

这里有两种方法,你可以去这个

#myscripy.rb 
# add following in your script 
require 'rubygems' 
require 'active_record' 
require YOUR_DB_ADAPTER_GEM #'mysql2', 'pg' 
require PATH_TO_YOUR_MODEL 

csv = CSV.read(file, col_sep: ",", headers: false) 

c = Customer.new 
csv.each do |row| 
    c.warranty_part_no = row[2], 
    c.warranty_part_desc = row[3] 
end 
c.save 

否则你可以简单的写rake任务(最好是在同一RailsApp)

require 'csv' 
namespace :import do 
task :csv_file => :environment do 
    csv = CSV.read(file, col_sep: ",", headers: false) 

    c = Customer.new 
    csv.each do |row| 
    c.warranty_part_no = row[2], 
    c.warranty_part_desc = row[3] 
    end 
    c.save 
    end 
end 

,并从您的命令行,当你在RailsApp可以拨打电话rake import:csv_file

评论我,如果您对此有任何疑问。

1

您也可以只是要求您的config/environment.rb访问您的模型。

1

修复您的问题

您的问题似乎是,你的Rails环境不装上你的脚本的启动。

正确初始化Rails环境,你需要:

Side-Not E在容易CSV导入

我一直觉得处理CSV文件作为数组的数组是相当clumpsy。

所以我写了一个小方法“process_csv”返回每一行中的CSV文件的哈希 - 用于创建ActiveRecord的或Mongoid记录更适合。

您可以使用下面的代码,并将其放在./config/initializers/process_csv.rb下,并将一个块传递给process_csv以为CSV文件中的每一行创建一个Consumer记录。

您可以使用:key_mapping选项CSV列重命名为您的ActiveRecord的模型正确的属性名称,并从结果哈希删除CSV密钥。

的源代码在这里详细的注释:

http://www.unixgods.org/~tilo/Ruby/process_csv_as_hashes.html

例如为:

require 'process_csv' 

File.process_csv(file) do | hash | 
    Consumer.create(hash) 
end 

享受!