Rails CSV导入 - 未初始化的常量Object :: Points

时间:2013-07-15 13:52:59

标签: ruby-on-rails database sqlite csv import

我正在尝试将CS​​V文件导入到rails项目的SQLite3数据库中的现有表中。

我在this solution上尝试了正确答案,但收到错误:

uninitialised constant Object::Points

这是我的主目录中的data.csv文件:

Item,2003,2004,2005,2006,2007
AA2,43,34,23,52,24
TT2,48,39,29,23,29

这是我的模型文件,保存在app \ models \ points.rb:

class Points < ActiveRecord::Base
  attr_accessible :Item, :2003, :2004, :2005, :2006, :2007
end

这是我的迁移文件,保存在db \ migrate \ 20130709123346_create_points.rb中:

class CreatePoints < ActiveRecord::Migration
  def change
    create_table :points do |t|
      t.varchar(255) :Item
      t.integer :"2003"
      t.integer :"2004"
      t.integer :"2005"
      t.integer :"2006"
      t.integer :"2007"  

      t.timestamps
    end
  end
end

以下是基于上面链接的正确解决方案尝试的内容:

  1. 创建名为import.rake的新文件并将其保存在lib \ tasks \ import.rake中:

    require 'csv'    
    
    csv_text = File.read('data.csv')
    csv = CSV.parse(csv_text, :headers => true)
    csv.each do |row|
      Points.create!(row.to_hash)
    end
    
  2. 然后我在命令行中运行bundle exec rake import.rake

  3. 运行此操作后,我收到错误:

    uninitialised constant Object::Points
    

    我必须遗漏导致此错误的内容。我做错了什么?

1 个答案:

答案 0 :(得分:1)

您需要将import.rake的内容定义为实际任务。此外,正如您的代码所代表的那样,rake对您的Rails环境一无所知,这就是它找不到Points的原因。例如

require 'csv'

namespace :import do
  task :points => :environment do
    csv_text = File.read('data.csv')
    csv = CSV.parse(csv_text, :headers => true)
    csv.each do |row|
      Points.create!(row.to_hash)
    end
  end
end

然后从命令行

bundle exec rake import:points

=> :environment对任务的依赖性将启动Rails环境。