我正在尝试在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。
答案 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)
,它也有效。