使用CSV在rake中获取UnknownAttributeError,rails app中存在属性

时间:2016-12-24 16:03:29

标签: ruby csv ruby-on-rails-5 rake-task

我正在尝试在rails 5上的ruby中使用rake任务批量加载CSV文件。

我有一个简单的模型,它将是一个电影列表。我有rails应用程序运行,可以成功创建一个新的电影与Web应用程序。当我运行rake任务时,它失败了 UnknownAttributeError:未知属性'Title'for Movie

这是我的架构:

 create_table "movies", force: :cascade do |t|
  t.string   "Title"
  t.string   "Genre"
  t.string   "Rating"
  <snip>
 end

这是我的创建方法(直接来自脚手架......)

def create
  @movie = Movie.new(movie_params)

  respond_to do |format|
    if @movie.save
      format.html { redirect_to @movie, notice: 'Movie was successfully created.' }
      format.json { render :show, status: :created, location: @movie }
    else
      format.html { render :new }
      format.json { render json: @movie.errors, status: :unprocessable_entity }
    end
  end
end

这是我的佣金任务:

desc "bulk load movies in the db"
task :upload_movies => [ :environment] do
  require 'csv' 

  f = "#{Rails.root}/tmp/movies.csv"

  raise "#{f} does not exist. Stoping import of movies" if !File.exists?(f)

  CSV.foreach(f, :headers => true) do |row|
    Movie.create!(row.to_hash)
  end
end

当我通过应用程序添加电影时,服务器控制台显示它正常工作:

  

(0.1ms)BEGIN   SQL(1.3ms)INSERT INTO“movies”(“Title”,“Genre”,“Rating”,“Lead”,“Director”,“Year”,“Type”,“Duration”,“Theatre”,“created_at” ,“updated_at”)VALUES($ 1,$ 2,$ 3,$ 4,$ 5,$ 6,$ 7,$ 8,$ 9,$ 10,$ 11)返回“id”[[“Title”,“芭蕾舞女演员”],[“类型”, “sci fi”,[“Rating”,“PG”],[“Lead”,“random”],[“Director”,“local”],[“Year”,2010],[“Type”,“ 3D“],[”持续时间“,90],[”剧院“,”3/4“],[”created_at“,2016-12-24 15:05:21 UTC],[”updated_at“,2016-12 -24 15:05:21 UTC]]      (0.6ms)COMMIT   重定向到http://localhost:3000/movies/1

我的CSV文件顶部如下所示:

Title,Genre,Rating,Lead,Director,Year,Type,Duration,Theater
The Avengers: Age of Ultron 3D,Action,PG-13,Robert Downey Jr.,Joss Whedon,2015,3D,141,3/4

这是rake任务的输出 - (我为此示例运行了迁移,只是这个社区会知道我的数据库是最新的...)

$ rake db:migrate
$ rake upload_movies
rake aborted!
ActiveModel::UnknownAttributeError: unknown attribute 'Title' for Movie.
/Users/ustonma/dev/stone/gl7movies/lib/tasks/movieUpload.rake:11:in `block (2 levels) in <top (required)>'
/Users/ustonma/dev/stone/gl7movies/lib/tasks/movieUpload.rake:10:in `block in <top (required)>'
Tasks: TOP => upload_movies
(See full trace by running task with --trace)
$ 

我错过了什么? -Thanks。

3 个答案:

答案 0 :(得分:0)

您确定尝试创建影片的哈希值是否有效?例如,如果Title是大写字母,它会炸毁activerecord。也许这样试试吧:

  {title: row[0], genre: row[1], ...}

答案 1 :(得分:0)

您可以尝试查看在迁移时创建的Movie表的列吗?

CommonsRequestLoggingFilter

并向我们展示结果

答案 2 :(得分:0)

这实际上是CSV文件编码的问题。该文件使用MS Excel保存,格式为CSV - UTF-8 (Comma delimited) (.csv)

CSV.foreach开始读取文件时,文件的第一个位置是一个表示UTF-8的字节字符串。我使用文本配合来&#34;另存为&#34; Unicode - UTF-8并且它有效。我还使用excel保存为Comma Separated Values (.csv),它也有效。

Rails 5中的Ruby(2.3.1)中的CSV似乎不像其他UTF-8编码那样。