5

我正在通过 Ruby on Rails 3 将 CSV 文件中的数据导入 MySQL db。客户模型已经创建。此外,下面的脚本将正确生成 puts row[2] 和 puts row[3]。当我为customers.warranty_part_no 和warranty_part_desc 的数据库字段添加分配时,它会产生以下错误。

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)

经过一些测试,我认为这个问题是因为我从命令行运行这个脚本,所以 customer.rb 模型没有使用较大的 rails 应用程序执行,因此永远不会创建 Customer 类。如何从命令行运行此脚本并利用 ActiveRecord 或 activerecord-import?如果这不可能,我该如何为其创建路线或从应用程序的视图中调用它?

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

4

5 回答 5

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

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

于 2012-07-19T01:53:59.723 回答
2

正如您所发现的,问题在于您的 Rails 环境没有加载。您可以在独立脚本中通过包含您的客户模型、active_record 并使用您的 database.yml 建立连接来执行此操作。

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

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

告诉 rake 加载 Rails ,=> :environment以便您的数据库连接和所有模型都在那里供您使用。

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

于 2012-07-19T01:35:24.310 回答
1

我相信您正在寻找的是 rails runner Rails Command Line Docs,它将在您的 rails 应用程序环境中执行您的 ruby​​ 脚本。

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

于 2012-07-18T17:29:32.430 回答
1

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

于 2012-07-19T15:04:52.647 回答
1

解决您的问题

您的问题似乎是您的 Rails 环境未在脚本启动时加载。

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

更容易导入 CSV 的旁注

我一直觉得将 CSV 文件作为 Arrays of Arrays 处理是非常笨拙的。

所以我写了一个小方法“process_csv”,它将CSV文件中的每一行作为哈希返回——更适合创建ActiveRecord或Mongoid记录。

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

您可以使用 :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

请享用!

于 2012-07-20T03:57:58.020 回答